堆排序

说白了,也就是大堆,或者小堆,通过删掉堆顶点,然后存入数组,来实现排序:

第一阶段:构建堆最多用2N次比较

第二阶段:第i次deleteMax最多用到2【logi】次比较,

总数最多2NlogN-O(N)次比较

代码:

 1 #include <iostream>

 2 #include <vector>

 3 using namespace std;

 4 template <typename Comparable>

 5 void heapsort(vector<Comparable> & a)

 6 {

 7     for(int i = a.size()/2; i>= 0 ;i--)

 8         percDown(a,i,a.size());

 9     for(int j=a.size()-1; j>0 ; j--)

10     {

11         swap(a[0],a[j]);

12         percDown(a,0,j);

13     }

14 }    

15 inline int leftChild(int i )

16 {

17     return 2*i;

18 }

19 template <typename Comparable>

20 void percDown(vector<Comparable> & a,int i,int n)

21 {

22     int child;

23     Comparable tmp;

24 

25     for(tmp = a[i] ; leftChild(i)<n ; i=child)

26     {

27         child = leftChild(i);

28         if(child != n-1 && a[child] < a[child+1])

29             child++;

30         if(tmp<a[child])

31             a[i]=a[child];

32         else

33             break;

34     }

35     a[i]=tmp;

36 }

37 int main()

38 {

39     vector<int> ivec;

40     ivec.push_back(1);

41     ivec.push_back(9);

42     ivec.push_back(2);

43     ivec.push_back(10);

44     ivec.push_back(3);

45     ivec.push_back(11);

46     ivec.push_back(4);

47     ivec.push_back(12);

48     ivec.push_back(5);

49     ivec.push_back(13);

50     ivec.push_back(6);

51     ivec.push_back(14);

52     ivec.push_back(7);

53     ivec.push_back(15);

54     ivec.push_back(8);

55     ivec.push_back(16);

56     heapsort(ivec);

57     for(int i =0;i<ivec.size();i++)

58         cout<<ivec[i]<<endl;

59     return 0;

60 }

结果如下:

堆排序

你可能感兴趣的:(堆排序)