[数据结构1.0]选择排序

鼠鼠前面的博客介绍过选择排序是常见的排序算法,选择排序有但不限于直接选择排序和堆排序!那么鼠鼠今天浅谈一下选择排序!

鼠鼠本博客用排升序来介绍选择排序!

目录

1.直接选择排序

1.1.直接选择排序

 1.2.直接选择排序特性

2.堆排序

2.1.堆排序

2.2.堆排序特性

3.效率比较


选择排序的基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

1.直接选择排序

1.1.直接选择排序

1.在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素。

2.若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。

3.在剩余的array[i]到array[n-2](array[i+1]到array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。

其实说简单点,拿排升序来说:“单趟” 就是遍历需要排序的乱序数组找出最小的数据与第一个数据交换。循环”多趟“在剩余的数据集合中找最小的数据与剩余数据集合的第一个数据交换,直到剩余数据集合数为1停止。

思想很简单,就算鼠鼠解释的不好,相信读者老爷也能明白的,看代码:

1.”单趟“代码(不是直接选择排序完整代码)

int i = begin;int mini = i;while (i <= end){if (a[mini] > a[i]){mini = i;}i++;}Swap(&a[mini], &a[begin]);

2.循环控制好begin就能很好控制好数据集合范围,直接选择排序完整代码如下:

void SelectSort(int* a, int begin, int end)
{while (begin < end){int i = begin;int mini = i;while (i <= end){if (a[mini] > a[i]){mini = i;}i++;}Swap(&a[mini], &a[begin]);begin++;}
}

我们拉出来试试能不能排好:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void SelectSort(int* a, int begin, int end)
{while (begin < end){int i = begin;int mini = i;while (i <= end){if (a[mini] > a[i]){mini = i;}i++;}Swap(&a[mini], &a[begin]);begin++;}
}void PrintArrar(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}int main()
{int a[] = { 7,5,6,1,3,4,2,2 };PrintArrar(a, sizeof(a) / sizeof(a[0]));SelectSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);PrintArrar(a, sizeof(a) / sizeof(a[0]));return 0;
}

 没啥问题!

 1.2.直接选择排序特性

 1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。

2. 时间复杂度很明显是O(N^2)。

3. 空间复杂度很明显是O(1)。

2.堆排序

2.1.堆排序

堆排序鼠鼠之前浅浅介绍过了,这篇博客介绍过,这里就不介绍了。唯一要注意:排升序要建大堆,排降序建小堆。

我们用堆排序排个升序看看:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//向下调整(大堆)
void AdjustDown(int* a, int parentcoordinate, int HeapSize)
{int childcoordinate = parentcoordinate * 2 + 1;while (childcoordinate < HeapSize){if (a[childcoordinate] < a[childcoordinate + 1] && childcoordinate + 1 < HeapSize){childcoordinate++;}if (a[parentcoordinate] < a[childcoordinate]){Swap(&a[parentcoordinate], &a[childcoordinate]);parentcoordinate = childcoordinate;childcoordinate = childcoordinate * 2 + 1;}else{break;}}
}//堆排序排升序
void HeapSort(int* a, int HeapSize)
{int i = 0;//排升序,建大堆(向下调整建堆法)for (i = (HeapSize - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, i, HeapSize);}int end = HeapSize - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, 0, end);end--;}
}int main()
{int a[] = { 90,80,60,20,40,70,60,30,30,110 };int Size = sizeof(a) / sizeof(a[0]);printf("堆排序前:");for (int i = 0; i < Size; i++){printf("%d ", a[i]);}printf("\n");HeapSort(a, Size);printf("堆排序后:");for (int i = 0; i < Size; i++){printf("%d ", a[i]);}return 0;
}

 确实排好了!

2.2.堆排序特性

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)。

3. 空间复杂度:O(1)。

3.效率比较

鼠鼠用这两排序来排10w个相同的随机数,大致能看出效率差距:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//直接选择排序
void SelectSort(int* a, int begin, int end)
{while (begin < end){int i = begin;int mini = i;while (i <= end){if (a[mini] > a[i]){mini = i;}i++;}Swap(&a[mini], &a[begin]);begin++;}
}//向下调整(大堆)
void AdjustDown(int* a, int parentcoordinate, int HeapSize)
{int childcoordinate = parentcoordinate * 2 + 1;while (childcoordinate < HeapSize){if (a[childcoordinate] < a[childcoordinate + 1] && childcoordinate + 1 < HeapSize){childcoordinate++;}if (a[parentcoordinate] < a[childcoordinate]){Swap(&a[parentcoordinate], &a[childcoordinate]);parentcoordinate = childcoordinate;childcoordinate = childcoordinate * 2 + 1;}else{break;}}
}
//堆排序排升序
void HeapSort(int* a, int HeapSize)
{int i = 0;//排升序,建大堆(向下调整建堆法)for (i = (HeapSize - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, i, HeapSize);}int end = HeapSize - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, 0, end);end--;}
}int main()
{int n = 100000;int* a = (int*)malloc(sizeof(int) * n);int* b = (int*)malloc(sizeof(int) * n);srand((unsigned int)time(0));for (int i = 0; i < n; i++){a[i] = rand() + i;b[i] = a[i];}int begin1 = clock();SelectSort(a, 0, n - 1);int end1 = clock();printf("SeleckSort:%d\n", end1 - begin1);int begin2 = clock();HeapSort(a, n);int end2 = clock();printf("HeapSort:%d\n", end2 - begin2);return 0;
}

我们可以看到在Debug版本下结果:

 感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/697633.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240513,常用算法(查找,排序,拷贝替换)

做着一些和考试无关的事情 常用查找算法——续 FIND_IF find_if //按条件查找元素&#xff0c;返回迭代器POS / END()find_if(beg,end,_Fred) _Fred函数或谓词&#xff08;返回BOOL类型的仿函数&#xff09; #include<iostream> #include<string> #includ…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与&#xff08;多&#xff09;Paxos等效的结果&#xff0c;并且与Paxos一样高效&#xff0c;但其结构与Paxos不同。这使得Raft比Paxos更易理解&#xff0c;也为构建实际系统提供…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

爱普生推出适用于物联网小尺寸温补晶振TG1612SLN

爱普生推出一款小尺寸温补晶振TG1612SLN&#xff0c;之前推出的小尺寸温补晶振TG2016SLN&#xff0c;封装2016已经是很小了&#xff0c;而TG1612SLN的尺寸仅为1.6x1.2x0.45毫米&#xff0c;不得不佩服爱普生的研发能力。 温度补偿晶体振荡器TG1612SLN使用爱普生开发和制造…

企业级WEB服务Nginx安装

企业级WEB服务Nginx安装 1. Nginx版本和安装方式 Mainline version 主要开发版本,一般为奇数版本号,比如1.19Stable version 当前最新稳定版,一般为偶数版本,如:1.20Legacy versions 旧的稳定版,一般为偶数版本,如:1.18Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安…

Ngnix VTS模块添加和测试

目录 VTS模块介绍 上传软件包xftp/lrzsz 执行脚本 添加vts的配置 测试 测试&#xff1a;nginx.conf配置文件是否有语法错误 测试&#xff1a;windows机器上访问效果 VTS模块介绍 Nginx VTS模块&#xff08;nginx Virtual Host Traffic Status Module&#xff09;是一个第三…

GLU(Gated Linear Unit) 门控线性单元

文章目录 一、RNN二、GLU2.1 整体结构2.2 输入层(Input SentenceLookup Table)2.3 中间层(ConvolutionGate)2.4 输出层(Softmax)2.5 实验结果2.6 实现代码 三、RNN与GLU的对比参考资料 GLU可以理解为能够并行处理时序数据的CNN网络架构&#xff0c;即利用CNN及门控机制实现了RN…

ES扩缩容

ES扩容 1.1 页面扩容ES1 1.2 拷贝插件及ssl文件 JSON [ec_admin@kde-offline3 ~]$ sudo rsync -avP /usr/kde_ec/2.3.6.6-1/elasticsearch1/plugins/* kde-offline6:/usr/kde_ec/2.3.6.6-1/elasticsearch1/plugins/ ;echo $? [ec_admin@kde-offline3 ~]$ sudo rsync -avP /us…

“圣诞树图案的打印~C语言”

圣诞树图案的打印~C语言 题目原文&#xff1a;[圣诞树](https://www.nowcoder.com/practice/9a03096ed8ab449e9b10b0466de29eb2?tpId107&rp1&ru/ta/beginner-programmers&qru/ta/beginner-programmers/question-ranking&difficulty&judgeStatus&tags&…

linux部署安装DataX和DataX-Web

1.基础环境 JDK&#xff08;1.8 及其以上都可以&#xff0c;推荐 1.8&#xff09;&#xff0c;安装过程略 Python&#xff08;2 或者 3 都可以&#xff09;&#xff0c;安装过程略 Apache Maven 3.6.1&#xff08;只有DataX源码编译安装时需要&#xff09; 1.1下载maven安装…

【MQTT】paho.mqtt.c 库的“介绍、下载、交叉编译” 详解,以及编写MQTT客户端例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-13 1…

kubeflow文档-介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…