堆排序
1 void SiftHeap(int r[] , int k , int n){ 2 int i , j ,temp; 3 i = k; 4 j = 2 * i + 1; //i为要筛选的结点,j为i的左结点 5 while(j < n){ 6 if(j < n - 1 && r[j] < r[j+1]) j++;//j取左右结点中的最大值 7 if(r[i] > r[j]) 8 break; 9 else{ 10 temp = r[i]; 11 r[i] = r[j]; //将结点i与较大的子结点交换 12 r[j] = temp; 13 int i = j; //在当前结点下继续筛选 14 j = 2*i + 1; 15 } 16 } 17 18 } 19 void HeapSort(int r[] , int n){ 20 for(int i = n / 2 - 1; i >= 0; --i){ 21 SiftHeap(r , i ,n); 22 } 23 for(int i = 1; i <= n -1; ++i){ 24 int temp = r[0]; 25 r[0] = r[n - 1]; 26 r[n - 1] = temp; 27 SiftHeap(r , 0 , n -1); 28 } 29 }
7、堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
7.1 算法描述
- 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
- 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
- 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。