内部排序
外部排序
c
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
// 调整堆
void HeadAdjust(int A[], int k, int len){
// A[0]暂时存孩子树的根节点
A[0] = A[k];
for (int i = 2 * k; i <= len; i *=2) {
// i如果等于len则没有右子树,也就没有比较左右子树的必要
if(i < len && A[i] < A[i+1]){
i++;
}
if(A[i] <= A[0]){
break;
} else{
// 将A[i]复制到父节点
A[k] = A[i];
// 修改k, 用以定位子树根节点应该放置的位置
k =i;
}
}
A[k] = A[0];
}
// 建堆
void BuildMaxHeap(int A[], int len){
for (int i = len / 2; i > 0; i--) {
HeadAdjust(A, i, len);
}
}
// 堆排序
void HeapSort(int A[], int len){
BuildMaxHeap(A, len);
for (int i = len; i > 1; i--) {
// 将根节点与末尾结点交换位置,那么最大元素就被移到数组最后面
swap(&A[i], &A[1]);
// 同时调整堆的时候只对前面i-1元素进行,这样影响不到后面自己排好的元素
HeadAdjust(A, 1, i-1);
}
}
int main() {
int a[] = {0, 3, 4,6,8,5,7,9,2,1};
int len = sizeof(a) / sizeof(a[0]);
HeapSort(a, len-1);
for (int i = 0; i < len; ++i) {
printf("%d\n", a[i]);
}
return 0;
}
执行结果
