堆排序

 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,则整个排序过程完成。

7.2 动图演示

posted @ 2019-04-29 22:06  unique_ptr  阅读(126)  评论(0编辑  收藏  举报