内排序-选择排序
来源:互联网 发布:ie11不支持javascript 编辑:程序博客网 时间:2024/06/03 05:16
选择排序:简单选择排序、树形选择排序、堆排序;
1、简单选择排序
一趟简单选择排序的操作为:通过n-1次关键字的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i个记录交换之。
再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
重复上述操作,共进行n-1趟排序后,排序结束。
实现代码:
public static void simpleSelectSort(int[] num){int temp,k;for(int i=0;inum[j]){k=j;}}temp=num[i];num[i]=num[k];num[k]=temp;}}
选择排序的主要操作是进行关键字间的比较,因此在改进简单选择排序应从如何减少“比较”出发考虑。显然,在n个关键字中选出最小值,至少进行n-1次比较,然而,在剩余的n-1个关键字中选择小值就并非一定要进行n-2次比较,若能利用前n-1次比较所得信息,则可以减少以后各趟选择排序所用的比较次数。
2、树形选择排序
首先对n个记录的关键字进行两两比较,然后在其中[n/2]个较小者之间再进行两两比较,如此重复,直至选出最小关键字的记录为止。
在输出最小关键字之后,根据关系的可传递性,欲选出次小关键字,仅需要将叶子节点中的最小关键字改为“最大值”,然后从该叶子节点开始,和其左(右)兄弟的关键字进行比较,则根节点的关键字即为次小关键字。
同理可依次从小到大的所有关键字。由于含有n个叶子节点的完全二叉树的深度为[log2n+1],则在树形选择排序中,除了最小关键字之外,每选择一个次小关键字仅需要进行[log2n]次比较,因此,它的时间复杂度为O(nlog2n)。
3、堆排序
堆排序:若在输出堆顶的最小值之后,使得剩余n-1个元素的序列重又建成一个堆,则可得到n个元素的次小值;如此反复执行,便能得到一个有序序列,这个过程称之为堆排序;
实现堆排序需解决的两个问题:
如何由一个无序序列建成一个堆?
如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?
1、建堆:
从一个无序序列建堆的过程就是一个反复“筛选”的过程,若将此序列看成是一个完全二叉树,则最后一个非终端结点是第[n/2](此无序序列对应的完全二叉树的最后一个非终端节点)个元素,由此“筛选”只需从[n/2]个元素开始,至第一个元素止,进行反复筛选;
2、输出堆顶元素,以堆中最后一个元素替代之;
3、然后将根节点值与左右子树的根节点值进行比较,并与其中小者进行交换;
4、重复上述操作,直至叶子节点,将得到新的堆;
5、重复第二步;
时间复杂度:O(nlogn)
不稳定
1 0
- 内排序-选择排序
- 内排序-选择类排序-堆排序
- 内排序(2)选择排序:直接选择和堆排序
- 内排序-选择类排序-简单选择排序
- 内排序(插入排序、冒泡排序、选择排序、shell排序、快速排序、归并排序、堆排序)
- 选择排序(内附代码)
- 内排序算法总结——选择排序
- 内排序算法的java实现---直接选择排序
- 排序-->选择排序(选择排序&&堆排序)
- 内排序
- 内排序
- 内排序
- 内排序
- 内排序-归并排序
- 内排序-插入排序
- 内排序-交换排序
- 排序 - [选择排序 - 堆排序]
- 排序-插入排序、选择排序
- String类
- MT6572 UART进meta设定
- 【HBase调优】Hbase万亿级存储性能优化总结
- NotePad++快捷键总结 f2到下一个标记
- Ubuntu 14.4下连接扩展屏
- 内排序-选择排序
- 【原创】黑科技库(二): 全排列函数 next_permutation
- myeclipse删除jar时出错,无法删除怎么办
- 496. Next Greater Element I LeetCode
- 数据结构学习笔记——01绪论
- 数据库事物与隔离级别
- Binary XML file line #2: Error inflating class <unknown>
- JDK8中的ConcurrentHashmap底层实现
- Eigen——四元数笔记