3. 堆排序
一、介绍
堆排序属于选择排序,它是利用堆这种数据结构而设计的一种排序算法。
升序排序采用最大堆,而降序排序采用最小堆。
二、基本思想
将待排序的数列构造成一个最大堆,每次都取堆顶的元素,将其放在数列的最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到升序的序列。
主要过程:构建最大堆 + 交换堆顶元素和末尾元素并重建最大堆
【详细步骤】
a.将无序序列构建成一个最大堆;
b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素。反复执行“调整+交换”步骤,直到整个序列有序。
三、代码
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
/* 构造最大堆 */
/*
* a为待排序的数组
* n是元素的个数,这里假设从下标1开始存放元素,故原数组的大小应为n+1
* 于是在完全二叉树中,由a[father] = a[lChild/2] = a[rChild/2]
*/
void init(int a[], int n)
{
for(int i = n / 2; i > 0; --i) {
int temp = a[i];
int son = i * 2;
while(son <= n) {
if(son < n && a[son] < a[son+1])
son++;
if(temp > a[son])
break;
else {
a[son/2] = a[son];
son = son * 2;
}
}
a[son/2] = temp;
}
}
int main()
{
// a[0]不存放元素,所以是对n=7个元素进行排序
int arr[8] = {0, 4, 3, 2, 7, 6, 8, 5};
// 重建+交换 执行n-1次
for(int i = 0; i < 6; ++i) {
init(arr, 7 - i); // 构建最大堆
swap(arr[1], arr[7-i]); // 交换堆顶和末尾元素
}
for(int i = 1; i <=7; ++i)
cout << arr[i] << " ";
cout << endl;
return 0;
}
补:上述构建最大堆的算法可查看《最大堆》。

浙公网安备 33010602011771号