链表:
#include <stdio.h>
// 大根堆
void HeapAdjust(SqList *L, int s, int n) {
int temp, j;
//
temp = L->r[s];
for(j=2*s; j<=m; j*=2) {
// 比较,记录j和j+1中较大的值,用于和temp比较
if(j<m && L->r[j] < L->r[j+1])
++j;
// 如果j和j+!中较大的值都比其父结点(temp)值小,
// 则直接跳出,父结点就是最大值,构成父亲和孩子的最大堆
if(temp >= L->r[j])
break;
// 否则, 将较大值给父结点
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
void HeapSort(SqList *L) {
int i;
// 建成大根堆
for(i=L->length/2; i>0; i--) {
HeapAdjust(L, i, L->length);
}
for(i=L->length; i>1; i--) {
swap(L, 1, i);
HeapAdjust(L, 1, i-1);
}
}
数组:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 大根堆,从小到大排序
void HeapAdjust(int *a, int s, int m) {
int temp, j;
temp = a[s];
for(j=2*s; j<=m; j*=2) {
if(j<m && a[j] < a[j+1])
++j;
if(temp >= a[j])
break;
a[s] = a[j];
s = j;
}
a[s] = temp;
}
void swap(int *a, int i, int j) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void HeapSort(int *a, int m) {
int i;
for(i=m/2; i>0; i--)
HeapAdjust(a, i, m);
for(i=m; i>1; i--) {
swap(a, 1, i);
HeapAdjust(a, 1, i-1);
}
}
int main(void) {
int a[100];
int m;
printf("请输入排序的个数:");
scanf("%d", &m);
srand(time(NULL));
for(int i=1; i<=m; i++)
a[i] = rand()%(1000-1)+1;
printf("排序前:\n");
for(int i=1; i<=m; i++)
printf("%d ", a[i]);
puts("");
HeapSort(a, m);
printf("排序后:\n");
for(int i=1; i<=m; i++)
printf("%d ", a[i]);
puts("");
return 0;
}