推排序
这篇博客讨论一下堆排序。
堆排序就是利用堆这种数据结构来实现排序,堆具有堆序性,最小堆的最小值一定在开头,最大堆的最大值也在开头,因此,我们可以利用堆来排序。
我们选用最大堆来排序,首先在原来的数组上构建一个最大堆,因此数组的开头就是最大值,我们把这个最大值和堆的最后一个元素交换位置,同时堆的大小减一,再整理堆,如此循环,最后的结果就是排好序的数组。
代码如下:
#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;
}
堆排序相对来说还是比较快的排序方法。
夜深了,,,
推荐一首歌 《塘桥夜话》
浙公网安备 33010602011771号