堆排序

来源:互联网 发布:mac修容粉色号怎么选 编辑:程序博客网 时间:2024/06/10 00:28

1、堆实际上就是一个完全二叉树。

2、堆分为大根堆和小根堆。大根堆:父节点的数据大于子节点。  小根堆:父节点的数据小于子节点。

3、小根堆代码如下:

#include <stdio.h>void HeapAdjust (int *arr,int i,int len)     // 把无序堆转换成小根堆{int tmp;for(int j=2*i;j<=len;j*=2){if(j<len && arr[j]>arr[j+1]){tmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;}if(arr[j]>arr[i]){break;}else{tmp=arr[j];arr[j]=arr[i];arr[i]=tmp;}}}void HeapSort (int *arr,int len) {int tmp;for (int i = len / 2; i > 0; --i){HeapAdjust(arr,i,len);          }for (int j = len; j > 0; --j)                // 把根节点与最后一个节点的数交换,多次执行,就会得到小根堆(有序数列){tmp = arr[1];arr[1] = arr[j];arr[j] = tmp;HeapAdjust(arr, 1, j-1);}}int main(){int arr[]={-1,5,3,6,4,7,2};int len=sizeof(arr)/sizeof(arr[0])-1;HeapSort (arr,len);for(int i=1;i<len+1;i++){printf("%d  ",arr[i]);}printf("\n");return 0;}

其程序结果运行如下图: