内排序-选择排序

来源:互联网 发布: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
原创粉丝点击