HeapSort非递归实现

来源:互联网 发布:中石油hazop风险矩阵 编辑:程序博客网 时间:2024/06/05 18:39

注意: 在改变被破坏的大小顶堆结构时,for循环的边界条件。

#include <stdio.h>#include <stdlib.h>void HeapSort(int array[],int len);void BuildMaxHeap();void AdjastDown(int array[],int k,int len);void Swap(int array[],int a,int b);void PrintArray(int array[],int len);int main(){    int array[14] = {0,100,25,65,43,57,3,77,91,12,22,10,50,41};    HeapSort(array,13);    PrintArray(array,13);}void HeapSort(int array[],int len){    BuildMinHeap(array,len);    int i;    for(i=len; i>1; i--){        Swap(array,1,i);        AdjastDown(array,1,i-1);        //PrintArray(array,i-1);    }}void BuildMinHeap(int array[],int len){    int i;    for(i=len/2; i>0; i--){        AdjastDown(array,i,len);    }}void AdjastDown(int array[],int k,int len){    int i;    for(i=2*k; i<=len;i=2*k){            if(array[i] >= array[i+1] && i<len){  //起初把'i<len'这个条件设置到了for循环的判断条件上,但后来发现,每次AdjastDown的最后一次操作,程序都不会正确提取出最后两个值的最小值,因为k=1时,i=2*1已经等于len,违背了i<len,所以不会执行for循环里面的swap操作。            i++;        }        if(array[k] <= array[i]){            break;        }        else{            Swap(array,k,i);            k=i;        }    }}void Swap(int array[],int a,int b){    int temp = array[a];    array[a] = array[b];    array[b] = temp;}void PrintArray(int array[],int len){    int i;    printf("\n");    for(i=1; i<=len; i++){        printf("%d  ",array[i]);    }}
原创粉丝点击