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]); } }
相关文章推荐
- HeapSort——堆排序实现(算法类)
- 堆排序Heap Sort——浅显易懂+Java实现
- HeapSort堆排序C++实现及相关背景知识
- heap sort算法实现
- 堆排序Heap Sort——浅显易懂+Java实现
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- 堆排序(HeapSort)之java实现
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- 堆排序算法的实现(HeapSort)
- 堆排序(Heap Sort)的C语言实现
- 无聊写排序之 ---- 归并排序(MergeSort) 非递归实现
- Java堆排序(HeapSort)算法实现
- STL源码——list sort:归并排序的非递归实现
- 归并排序(mergeSort)之递归实现
- 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)
- heapsort堆排序(3种语言实现 c/java/python)
- 堆排序(Heapsort)之Java实现
- Java实现堆排序(Heapsort)实例代码
- PAT程序设计考题——甲级1098(Insertion or Heap Sort ) C++实现
- 排序函数(直接InsertSort,希尔ShellSort,选择SelectSort,快排QuickSort,堆排HeapSort,归并MergeSort)的实现(除基数排序)