大端堆排序算法

内部排序

直接插入排序算法

折半插入排序

希尔排序算法

冒泡排序算法

快速排序算法

简单选择排序算法

外部排序

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;
}

执行结果