堆排序

分析:

       堆排序的过程中先建立一个大根堆,使每一个父节点都比其子节点的数大,因此数组的第一个数为最大的数。然后将数组的第一个数与数组的最后一个数进行交换,并将数组的最大索引减一,然后将数组从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;
}

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bde1e942b717720b51b64f8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞