排序之选择排序
2015-10-04 14:45
183 查看
排序分为5类,本篇文章主要是研究选择排序,选择排序分为直接选择和堆排序。
选择:每一步都从待排序的记录中选择出最小的,按顺序存放在已排好序的记录后。
直接选择排序:
第一趟:
如上图初始状态为 3820 46 38 74 91 12 25,他们是带排序的记录,从待排序的记录中选择出最小的为12,按顺序存放在已排好序的记录后,因为还没有排好的序列,所以12就是第1个,和第一个38交换。
第二趟:
第一趟结束后,未排序的为上图“第1趟”中除‘12’外的其他的黑色的记录,重复从待排序的记录中选择出最小的为12,按顺序存放在已排好序的记录后,剩余的最小的为20,要放在12的后面,本例中不用动20
第三趟……一直到所有的比较完毕,这个排序的过程形成一个三角形,如上图中红色区。
时间复杂度:
如果带排序列有n个元素,第1趟要比较n-1次,第2趟n-2次吗,第n-1趟1次,所以排完所有的就要进行n(n-1)/2次,所以时间复杂度为O(n2)。
堆排序:
堆排序是对直接选择排序的改进,减少比较的次数,提高效率,比较复杂的是在建堆的过程。建堆:
1、 按照层的顺序先建好一个二叉树。从0开始对节点进行编码。
2、 对于有n个元素的序列从 ⌊ n/2⌋-1(最后一个非叶子节点)开始比较,首先和其子节点,上图建的是小顶堆,所以如果比子节点小则交换,如果有两个子节点且都小于父节点,则将父节点和较小的节点交换。
3、 然后比较上一个节点,直到建好堆。
取出堆中的元素:
将根节点和最后一个叶子节点交换,然后重新建堆。重复过程直到所有的节点输出。
小结:
选择排序的中心思想就是“待排序的记录中选择出最小的,按顺序存放在已排好序的记录后”。堆排序是在直接排序上的一种改进,可以借助之前排序的结果,减少比较的次数,降低时间复杂度。
相关文章推荐
- 堆排序
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#堆排序实现方法
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C#折半插入排序算法实现方法
- SQL进行排序、分组、统计的10个新技巧分享
- C++实现位图排序实例
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)
- PHP下对数组进行排序的函数