堆排序

分析:

       堆排序的过程中先建立一个大根堆,使每一个父节点都比其子节点的数大,因此数组的第一个数为最大的数。然后将数组的第一个数与数组的最后一个数进行交换,并将数组的最大索引减一,然后将数组从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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞