#include<iostream>
using namespace std;
//升序建立最大堆;降序建立最小堆
void heapadjust(int arr[], int start, int end) {
int tmp = arr[start];
//根结点从0开始,所以i结点的左右孩子结点的下标为2i+1和2i+2
for (int i = 2 * start + 1; i <= end; i = 2 * i) {
if (i < end&&arr[i] < arr[i + 1]) i++;
if (arr[i] <= temp) break;
else {
arr[start] = arr[i];
start = i;
}
}
arr[start] = tmp;
}
/*
void heapadjust(int arr[], int pos, int len) {
int tmp,child;
//根结点从0开始,所以i结点的左右孩子结点的下标为2i+1和2i+2
for (temp=arr[pos];2*pos+1<=len;pos=child) {
child=2*pos+1;
if (child < end&&arr[child] < arr[child + 1]){
child++;
}
if (arr[pos] < arr[child]) arr[pos] = arr[child];
else break;
}
arr[pos] = tmp;
}
*/
void heapsort(int arr[], int len) {
for (int i = len / 2-1; i >= 0; i--) {
heapadjust(arr, i, len-1);
}
for (int i = len - 1; i >= 0; i--) {
int tmp = arr[i];
arr[i] = arr[0];
arr[0] = tmp;
heapadjust(arr, 0, i - 1);
}
}
int main() {
int arr[] = { 5,4,9,8,7,6,0,1,3,2 };
int len = sizeof(arr) / sizeof(arr[0]);
heapsort(arr, len);
for (int i = 0; i < len; i++) {
cout << arr[i] << ' ';
}
cout << endl;
system("pause");
return 0;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布