最近在备考二级
复习 预习到排序这一块
前来整理一下堆排序的代码
堆排序的具体概念与演示:堆排序
#include<stdio.h>
void swap(int arr[], int x, int y) {
int temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
void heapify(int arr[], int n, int i) {//堆化
if(i >= n) {
return ;
}
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if(c1 < n && arr[max] < arr[c1]) {
max = c1;
}
if(c2 < n && arr[max] < arr[c2]) {
max = c2;
}
if(max != i) {
swap(arr, max, i);
heapify(arr, n, max);
}
}
void build_heap(int arr[], int n) {//构建堆
int last_node = n-1;
int parents = (last_node-1)/2;
int i;
for(i = last_node; i >= 0; i--) {
heapify(arr, n, i);
}
}
void heap_sort(int arr[], int n) {//堆排序
build_heap(arr, n);
int i;
for(i = n-1; i >= 0; i--) {
swap(arr, i, 0);
heapify(arr, i, 0);
}
}
int main() {//测试
int tree[] = {7,3,1,3,4,6,77,9,33};
int n = sizeof(tree)/sizeof(int);
int i;
for(i = 0; i < n; i++) {
printf("%d ",tree[i]);
}
printf("\n");
heap_sort(tree, n);
for(i = 0; i < n; i++) {
printf("%d ",tree[i]);
}
printf("\n");
return 0;
}