堆排序的运用和算法
堆排序(HeapSort),指利用堆这种数据结构来设计一种排序算法。堆积是一个近似完全二叉树的结构。同时存在最大堆和最小堆两个特殊情况。堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的时间复杂度是(o=nlogn),是一种不稳定的排序方法。
题目描述
编写程序,实现堆排序
输入
记录个数
记录1 记录2 记录3 …,
输出
记录x1 记录x2 记录x3 …
样例输入
10
42 18 35 41 90 65 49 19 53 75
样例输出
18 19 35 41 42 49 53 65 75 90
- 算法描述
- 将初始待排序关键字序列(R1,R2…Rn)构建成一个堆,这个堆位最初始的无序状态。
- 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2…Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
- 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
- 代码实现
//构造最小堆(仅中间一步操作)
void MinHeapFixDown(int a[], int i, int n){
int j = 2 * i + 1;
int temp = a[i];
while(j < n){
if(j+1<n&&a[j]<a[j+1])
j++;
if(temp > a[j])
break;
else{
a[i]=a[j];
i=j;
j=2*i+1;
}
}
a[i]=temp;
}
//n为数组长度(默认数组从0号位开始存储)
void HeapSort(int a[], int n){
for(int i= n/2-1;i>=0;i--)
MinHeapFixDown(a,i,n);
for(int i=n-1;i>=1;i--){
swap(a[i],a[0]);
MinHeapFixDown(a,0,i);
}
}