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; }
补:上述构建最大堆的算法可查看《最大堆》。