您的位置:首页 > 理论基础 > 数据结构算法

HeapSort非递归实现

2017-09-14 15:25 239 查看
注意: 在改变被破坏的大小顶堆结构时,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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息