堆排序
一、选择排序
void Selection_Sort(ElementType A[], int N) { for(i=0;i<N;i++) { MinPosition = ScanfForMin(A, i, N-1); /* 从A[i]到A[N-1]中找最小元,并将其位置赋给MinPosition */ Swap(A[i], A[MinPosition]); /* 将未排序部分的最小元换到有序部分的最后位置 */ } }
无论如何:T = O(N2)
如何快速找到最小元
二、堆排序
算法1
void Heap_Sort(ElementType A[], int N) { BuildHeap(A); /* O(N) */ for(i=0;i<N;i++) TmpA[i] = DeleteMin(A); /* O(logN) */ for(i=0;i<N;i++) /* O(N) */ A[i] = TmpA[i]; }
T(N)=O(NlogN)
需要额外O(N)的空间,并且赋值元素需要时间
算法2
void Heap_Sort(ElementType A[], int N) { for(i=N/2-1;i>=0;i--) /* BuildHeap */ PercDown(A, i, N); for(i=N-1;i>0;i--) { Swap(&A[0], &A[i]); /* DeleteMax */ PercDown(A, 0, i); } }
定理:堆排序处理N个不同元素的随机排列的平均比较次数是2NlogN - O(NloglogN)。
虽然堆排序给出最佳平均时间复杂度,但实际效果不如用Sedgewick增量序列的希尔排序。
无欲速,无见小利。欲速,则不达;见小利,则大事不成。