堆排序C語言實現

堆構建過程請參照上一篇博客《大根堆小根堆的實現》http://blog.csdn.net/stormlovetao/article/details/8665506算法

這裏再加上一個堆的排序算法api

首先看一個例子的演示(圖片均來自哈工大李建中《算法設計與分析》課件)數組

經過這個例子不難看出,主要思想是將大根堆的對頂取出,放到數組的最後一個位置,將最後一個位置原來的數放到堆頂,而後對堆頂作調整Max-Heapify(見連接內博客)。ui

算法僞代碼:spa

重點來啦,直接上代碼,代碼親測沒有問題的,只是可能得換一下輸入數據而已。.net

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <assert.h> #include <string.h> /* 目的:創建大根堆,也能夠變成小根堆, 核心:堆的調整 輸入:文件,整數以空格隔開 輸出:大根堆 */ void Swap(uint32_t* array, uint32_t i, uint32_t j) { assert(array); uint32_t tmp; tmp = array[j]; array[j] = array[i]; array[i] = tmp; } /*大根堆調整*/ void MaxHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode) { uint32_t leftChild, rightChild, largest; leftChild = 2*currentNode + 1; rightChild = 2*currentNode + 2; if(leftChild < heapSize && array[leftChild] > array[currentNode]) largest = leftChild; else largest = currentNode; if(rightChild < heapSize && array[rightChild] > array[largest]) largest = rightChild; if(largest != currentNode) { Swap(array, largest, currentNode); MaxHeapify(array, heapSize, largest); } } /*構建大根堆*/ void MaxHeapCreat(uint32_t* array, uint32_t heapSize) { int i; for(i = heapSize/2; i >= 0; i--) { MaxHeapify(array, heapSize, i); } } /*小根堆調整*/ void MinHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode) { uint32_t leftChild, rightChild, minimum; leftChild = 2*currentNode + 1; rightChild = 2*currentNode + 2; if(leftChild < heapSize && array[leftChild] < array[currentNode]) minimum = leftChild; else minimum = currentNode; if(rightChild < heapSize && array[rightChild] < array[minimum]) minimum = rightChild; if(minimum != currentNode) { Swap(array, minimum, currentNode); MinHeapify(array, heapSize, minimum); } } /*構建小根堆*/ void MinHeapCreat(uint32_t* array, uint32_t heapSize) { int i; for(i = heapSize/2; i >= 0; i--) { MinHeapify(array, heapSize, i); } } void HeapSort(uint32_t* array, uint32_t heapSize) { MaxHeapCreat(array, heapSize); int i; uint32_t arraySize = heapSize; for(i = arraySize - 1; i >= 1; i--) { Swap(array, 0, i); heapSize--; MaxHeapify(array, heapSize, 0); } } int main() { uint32_t tmp; uint32_t *array; array = malloc(sizeof(uint32_t)); int i, heapSize = 0; /*從文件中讀出待排序數據*/ char* filePathway = "C:/Users/Administrator/Desktop/data.txt"; FILE* fp; fp = fopen(filePathway, "rb"); if(!fp) { fprintf(stderr, "Can not open file correctly\n"); } while(!feof(fp)) { fscanf(fp, "%d", &tmp); heapSize++; array = realloc(array, sizeof(uint32_t) * (heapSize )); if(array == NULL) { fprintf(stderr, "realloc error!\n"); return 1; } array[heapSize - 1] = tmp; } printf("The origen dataset:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } printf("\n"); /*構建小根堆並輸出*/ MinHeapCreat(array, heapSize); printf("Output the MinHeap:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } printf("\n"); /*構建大根堆並輸出*/ MaxHeapCreat(array, heapSize); printf("Output the MaxHeap:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } /*堆排序*/ HeapSort(array, heapSize); printf("Output the SortedHeap:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } free(array); fclose(fp); return 0; }