常见的排序算法:
1.算法思想
首先从最后一个非叶子结点进行调整,将该结点及其左右子结点的最大值存入该结点中。然后交换堆顶和最后一个数据,再从堆顶开始进行调整,直到全部完成。
2.测试结果
3.完整代码
#include <malloc.h>
#include <stdio.h>
#define MAXSIZE 20
//大顶堆
void adjustHeap(int a[], int k, int len) {
int left = 2*k+1, right = 2*k+2;//左右结点
int temp, maxIndex=k;
if(left < len && a[left] > a[maxIndex])
maxIndex = left;//先将最大值设为左结点
//如果右结点存在且更大,选择右结点
if(right < len && a[right] > a[maxIndex])
maxIndex = right;
//最大结点不是父结点,说明发生了交换
if(maxIndex != k) {
temp = a[k];
a[k] = a[maxIndex];
a[maxIndex] = temp;
//对交换后的子堆进行排序
adjustHeap(a, maxIndex, len);
}
}
void heapSort(int a[],int len) {
int mid = (0+len) / 2 - 1;
int temp;//用于交换
//首先对初始堆进行调整
for(int i=mid; i>=0; i--) {
adjustHeap(a, i, len);
}
//调整完成,开始输出
for(int i=len-1; i>=0; i--) {
//交换数据
temp = a[0];
a[0] = a[i];
a[i] = temp;
//交换完成后继续调整
adjustHeap(a, 0, i);
}
}
int main() {
int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
int len = sizeof(a) / sizeof(a[0]);
int i;
printf("排序前为:\n");
for (i = 0; i < len; i++) {
printf("%d\t", a[i]);
}
heapSort(a, len);
printf("\n排序后为:\n");
for (i = 0; i < len; i++) {
printf("%d\t", a[i]);
}
return 0;
}