基本概念:堆排序是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一棵完全二叉树,

根节点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆。堆排序主要包括两个过程:

一是构建堆, 二是交换堆顶元素与最后一个元素的位置。

 

堆排序思想:
1.   将序列构造成一棵完全二叉树 ;
2.   把这棵普通的完全二叉树改造成堆,便可获取最小值 ;
3.   输出最小值 ;
4.   删除根结点,继续改造剩余树成堆,便可获取次小值 ;
5.   输出次小值 ;
6.   重复改造,输出次次小值、次次次小值,直至所有结点均输出,便得到一个排序 。

 

堆排序的特点:

稳  定  性:不稳定

时间复杂度:O(nlogn)

堆排序对记录较少的文件效果一般,但对于记录较多的文件很有效果,其运行时间主要耗费在创建堆与调整堆上。

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void AdjustMinHeap(int *a, int pos, int len)
 6 {
 7     int temp;
 8     int child;
 9 
10     for (temp = a[pos]; 2 * pos + 1 <= len; pos = child)
11     {
12         child = 2 * pos + 1; 
13         if (child < len && a[child] > a[child + 1])
14         {
15             child++;
16         }
17         if (a[child] < temp)
18         {
19             a[pos] < a[child];
20         }
21         else
22         {
23             break;
24         }
25     }
26     a[pos] = temp;
27 }
28 
29 void Swap(int a, int b)
30 {
31     int temp;
32     temp = a;
33     a = b;
34     b = temp;
35 }
36 
37 void PrintArray(int *a, int length)
38 {
39     int i;
40 
41     for (i = 0; i < length; i++)
42     {
43         printf("%d ", a[i]);
44     }
45     printf("\n");
46 }
47 
48 void HeapSort(int *array, int len)
49 {
50     int i;
51 
52     for (i = len / 2 - 1; i >= 0; i--)
53     {
54         AdjustMinHeap(array, i, len - 1);
55     }
56     for (i = len -1; i >= 0; i--)
57     {
58         Swap(array[0], array[i]);
59         AdjustMinHeap(array, 0, i - 1);
60     }
61 }
62 
63 int main()
64 {
65     int array[] = {0, 13, 1, 14, 27, 18};
66     int length = sizeof(array) / sizeof(array[0]);
67 
68     HeapSort(array, length);
69     PrintArray(array, length);
70     while(1);
71     return 0;
72 }