首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

堆排序C语言兑现

2013-03-16 
堆排序C语言实现堆构建过程请参照上一篇博客《大根堆小根堆的实现》http://blog.csdn.net/stormlovetao/arti

堆排序C语言实现

堆构建过程请参照上一篇博客《大根堆小根堆的实现》http://blog.csdn.net/stormlovetao/article/details/8665506

这里再加上一个堆的排序算法

首先看一个例子的演示(图片均来自哈工大李建中《算法设计与分析》课件)

堆排序C语言兑现堆排序C语言兑现

堆排序C语言兑现

堆排序C语言兑现

堆排序C语言兑现

堆排序C语言兑现

通过这个例子不难看出,主要思想是将大根堆的对顶取出,放到数组的最后一个位置,将最后一个位置原来的数放到堆顶,然后对堆顶做调整Max-Heapify(见链接内博客)。

算法伪代码:

堆排序C语言兑现

重点来啦,直接上代码,代码亲测没有问题的,只是可能得换一下输入数据而已。

#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;elselargest = 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;elseminimum = 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;}


 

热点排行