堆排

1、首先建立大根堆

2、然后交换堆首和堆尾,将堆大小减一,将堆尾元素退出堆结构,排好一个数

3、循环即可知道堆大小为1

//堆排序
#include <iostream>
using namespace std;

void swap(int arr[], int i, int j) {
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}
void heap_insert(int arr[],int index) {
	while (arr[index] > arr[(index - 1) / 2]) {
		swap(arr, index, (index - 1) / 2);
		index = (index - 1) / 2;
	}
}
void heapify(int arr[], int index,int heap_size) {
	int left = index * 2 + 1;
	while (left<heap_size)
	{
		int largest = (left + 1 < heap_size) && (arr[left + 1] > arr[left]) ? left + 1 : left;
		largest = arr[largest] > arr[index]?largest:index;
		if (largest == index) {
			break;
		}
		swap(arr, largest, index);
		//更新index
		index = largest;
		//更新left
		left = index * 2 + 1;
	}
	
}
int main() {
	int n;
	while (cin >> n) {
		int* p = new int[n];
		for (int i = 0; i < n; i++) {
			cin >> p[i];
		}
		for (int i = 0; i < n; i++) {
			heap_insert(p, i);//搞成大根堆
		}
		int heap_size = n;
		swap(p, 0, --heap_size);//换
		while (heap_size > 0) {
			heapify(p, 0, heap_size);//有一个index改变了,再搞成大根堆
			swap(p, 0, --heap_size);//换
		}
		for (int i = 0; i < n; i++) {
			cout << p[i] << " ";
		}
		cout << endl;
	}
}

测试:

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/88526557
今日推荐