堆排序(Heap Sort)

  堆排序的时间复杂度是O(nlgN),与快速排序达到相同的时间复杂度。但是在实际应用中,我们往往采用快速排序而不是堆排序。这是因为快速排序的一个好 的实现,往往比堆排序具有更好的表现。在堆排序算法中,我们使用的是最大堆。最小堆通常在构造优先队列时使用。

  代码实现:

 1 /*

 2   Name: 堆排序(Heap Sort) 

 3   Author: Vincent 

 4   Date: 11/10/12 22:56

 5 */

 6 #include <stdio.h>

 7 #include <stdlib.h>

 8 

 9 int size = 10;

10 //输出当前堆的序列 

11 void PrintHeap(int arr[],int size){

12     int i;

13     for (i=1;i<=size;i++)

14         printf("%d ",arr[i]);

15     printf("\n");

16 }

17 //保持堆的性质 

18 //MaxHeapify让arr[i]在最大堆中下降,

19 //使其i为根的子树成为最大堆 

20 void MaxHeapify(int arr[],int idx,int size){

21     int largest=idx;

22     int temp;

23     int lt=2*idx,rt=2*idx+1;

24     //'lt'为左孩子,'rt'为右孩子 

25     if(lt<=size && arr[lt]>arr[idx])

26         largest=lt;

27     else

28         largest = idx;

29     if(rt<=size && arr[rt]>arr[largest]) 

30         largest=rt;

31     if(largest!=idx){

32         temp=arr[idx];

33         arr[idx]=arr[largest];

34         arr[largest]=temp;

35         

36         MaxHeapify(arr,largest,size);

37         }

38 }

39 

40 //建堆 

41 void BuildMaxHeap(int arr[]){

42     int i;

43     for(i=size/2;i>=1;i--){

44         MaxHeapify(arr,i,size); 

45         //进行下滤操作 

46    }

47 }

48 

49 //堆排序

50 // 

51 void HeapSort(int arr[]){

52     int i,temp;

53     int len=size;

54     BuildMaxHeap(arr);  //建立堆 

55     printf("排序过程:\n");

56     PrintHeap(arr,size);

57     

58     for( i=size;i>1;i--){

59         temp=arr[1];

60         arr[1]=arr[i];

61         arr[i]=temp;   //交换堆顶和堆底的数 

62         len--;   //每交换一次就少个数 

63         MaxHeapify(arr,1,len);

64     

65         PrintHeap(arr,size);

66    } 

67 }

68 

69 int main(int argc, char *argv[])

70 {

71    printf("Input the numbers:\n");

72    int arr[15] = {0,4, 1, 3, 2, 8, 9, 10, 13, 6, 7};

73    //这里实际有11个数,在调用PrintHeap函数时会过滤到第一个数,暂时不知道怎么解决 

74    PrintHeap(arr,size);

75    

76    HeapSort(arr);

77    

78    printf("堆排序后:\n");

79    PrintHeap(arr,size);

80    

81    system("PAUSE");    

82    return 0;

83 }

 

 

你可能感兴趣的:(sort)