C++实现大根堆排序

#include 

using namespace std;

void Siftheap(int a[], int i, int n){
	int j = 2 * i + 1, temp;//i指向分叉结点,j指向i的左结点
	while (j < n) {
		if (j < n-1 && a[j] < a[j + 1])//挑选出i的左右结点中最大的那个
			j++;
		if (a[i] > a[j])//若a[i]大于a[j]说明i往下满足大根堆排序
			break;
		else {//否则交换i与子结点的值,并从子结点处继续往下排序
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			i = j;
			j = 2 * i + 1;
		}
	}
}

int main() {
	int a[100] = { 0 }, temp, n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	for (int i = (n - 1) >> 1; i >= 0; i--)//从堆中最末尾的分支开始排序逐渐向上到根结点
		Siftheap(a, i, n);
	for (int i = 1; i < n ; i++) {//将大根堆的根结点与a[n-1]交换(相当于提取),并对根顶部重新排序
		temp = a[0];
		a[0] = a[n-i];
		a[n-i] = temp;
		Siftheap(a, 0, n - i);
	}
	for (int i = 0; i < n; i++)
		cout << a[i] << ",";
}

你可能感兴趣的:(算法)