推排序

     这篇博客讨论一下堆排序。

 

    堆排序就是利用堆这种数据结构来实现排序,堆具有堆序性,最小堆的最小值一定在开头,最大堆的最大值也在开头,因此,我们可以利用堆来排序。

 

    我们选用最大堆来排序,首先在原来的数组上构建一个最大堆,因此数组的开头就是最大值,我们把这个最大值和堆的最后一个元素交换位置,同时堆的大小减一,再整理堆,如此循环,最后的结果就是排好序的数组。

 

  代码如下:

 

#include<iostream>

using namespace std;

int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};

#define LeftChild(i) (2 * (i) + 1)    //标号从0开始,因此左儿子在2i + 1处


//最大堆,最大值在开头
void PercDown (int A[],int i, int N)
{
   int Child;
   int Tmp;
   for(Tmp = A[i]; LeftChild(i) < N; i = Child)
   {
      Child = LeftChild(i);
	  if(Child != N-1 && A[Child + 1] > A[Child])  //寻找较大的儿子
		  Child++;
	  if(Tmp < A[Child])
		  A[i] = A[Child];
	  else 
		  break;

   }
   A[i] = Tmp;
}
void Swap(int &a, int &b)
{
   int c;
  c = a;
  a = b;
  b = c;
}
void Heapsort (int A[], int N)
{
   int i;
   for(i = N / 2; i >= 0; i--)    //在数组上构建最大堆
	   PercDown(A,i,N);
   for(i = N - 1; i > 0; i--)
   {
      Swap(A[0],A[i]);   //开始排序,把最大值换到后面去
	  PercDown(A,0,i);   //整理堆,剩下元素的最大值会回到开头
   }
}

int main ()
{
	Heapsort (A, 13);
	for(int i = 0; i != 13; ++i)
    {
       cout << A[i] << "  ";
    }
    cout << endl;
    return 0;
}

  堆排序相对来说还是比较快的排序方法。

 

    夜深了,,,

   

   推荐一首歌 《塘桥夜话》

  

posted on 2017-05-11 20:08  wu_xin  阅读(207)  评论(0编辑  收藏  举报

导航