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;
}

补:上述构建最大堆的算法可查看《最大堆》。  

原文地址:https://www.cnblogs.com/xzxl/p/9580977.html