线性建堆法

#include <iostream>
using namespace std;

void downUpdate(int *arr, int n, int ind) {
    
    
	while ((ind << 1) <= n) {
    
    
		int temp = ind, l = temp << 1, r = temp << 1 | 1;
		if (arr[temp] > arr[l]) temp = l;
		if (r <= n && arr[temp] > arr[r]) temp = r;
		if (temp == ind) break;
		swap(arr[temp], arr[ind]);
		ind = temp;
	}
	return;
}
void heap_sort(int* arr, int n) {
    
    
	arr -= 1;
	//建堆
	for (int i = n >> 1; i >= 1; i--) {
    
    
		downUpdate(arr, n, i);
	}
	//堆排序
	for (int i = n; i > 1; i--) {
    
    
		swap(arr[i], arr[1]);
		downUpdate(arr, i- 1, 1);
	}
	return;
}

void output(int* arr, int n) {
    
    
	printf("[");
	for (int i = 0; i < n; i++) {
    
    
		i&& printf(" ");
		printf("%d", arr[i]);
	}
	printf("]\n");
	return;
}
int main() {
    
    
	srand(time(0));
#define MAX_N 20
	int arr[MAX_N] = {
    
     0 };
	for (int i = 0; i < MAX_N; i++) {
    
    
		arr[i] = rand() % 100;
	}
	output(arr, MAX_N);
	heap_sort(arr, MAX_N);
	output(arr, MAX_N);
#undef MAX_N
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40713201/article/details/125364719