标签:单选 插入 ++i sel 完全 最小 交换 简单选择 之间
选择排序的基本思想是:每一趟从待排序的记录中选出关健字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。
简单选择排序(Simple Selection Sort)也称作直接选择排序
代码如下
void SelectSort(int[] list){ for(int i=0;i<list.length;i++){ int min=list[i]; int t=i; for(int j=i;j<list.length;j++){ if(min>list[j]){ min=list[j]; t=j; } } list[t]=list[i]; list[i]=min; } }
算法时间复杂度O(n2)空间复杂度为1
算法特点
(1)就选择排序方法本身来讲,它是一种稳定的排序方法
(2)可用于链式存储
(2)移动次数较少,当每一记录占用的空间较多时,此方法比直接插入排序快
堆排序算法
堆排序(Heap Sort)是一种树形选择排序,在排序过程中,将待排序的记录r[1...n]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序的序列中选择关键字最大(或最小)的记录。
算法如下
public void heapAdjust(int H[],int start,int end){ int temp=H[start]; for(int i=2*start+1;i<=end;i*=2){ if(i<end&&H[i]<H[i+1]){ ++i; } if(temp>H[i]){ //左右孩子中获胜者与父亲的比较 break; } //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选 H[start]=H[i]; start=i; } H[start]=temp;//插入最开始不和谐的元素 } void heapSort(int A[],int n){ //先建立大顶堆 for(int i=n/2;i>=0;--i){ heapAdjust(A,i,n); } //进行排序 for(int i=n-1; i>0; --i) { //最后一个元素和第一元素进行交换 int temp=A[i]; A[i] = A[0]; A[0] = temp; //然后将剩下的无序元素继续调整为大顶堆 heapAdjust(A,0,i-1); } }
时间复杂度为O(nlog2 n) 空间复杂度为O(1).
算法特点
(1)是不稳定
(2)只能用于顺序结构,不能用于链式
(3)初始建堆所需的次数较多,因此记录数较少,因此记录数较少时不宜采用。
标签:单选 插入 ++i sel 完全 最小 交换 简单选择 之间
原文地址:http://www.cnblogs.com/fxbbk/p/7338336.html