分析:
堆排序的过程中先建立一个大根堆,使每一个父节点都比其子节点的数大,因此数组的第一个数为最大的数。然后将数组的第一个数与数组的最后一个数进行交换,并将数组的最大索引减一,然后将数组从0开始与它的儿子最大者比较,将大者放在父节点。如此循环之后,数组从左到右依次从小到大排序。
堆排序C语言代码:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void HeapSort(int arr[],int length);
void heapInsert(int arr[], int index);
void heapify(int arr[], int index, int size);
void swap(int arr[], int i, int j);
int main(){
srand((unsigned) time(NULL));
int arr[10];
int i=0;
int arr_length=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<arr_length;i++){
arr[i]=(int)(rand()%100-rand()%100);
printf("%d ",arr[i]);
}
printf("\n");
HeapSort(arr,arr_length);
printf("归并排序后为:");
for(i=0;i<arr_length;i++){
printf("%d ",arr[i]);
}
}
void HeapSort(int arr[],int length) {
for (int i = 0; i < length; i++) {
heapInsert(arr, i);
}
swap(arr, 0, --length);
while (length > 0) {
heapify(arr, 0, length);
swap(arr, 0, --length);
}
}
void heapInsert(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 size) {
int left = index * 2 + 1;
while (left < size) {
int largest = left + 1 < 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 = largest;
left = index * 2 + 1;
}
}
void swap(int arr[], int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}