基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。首先建立堆,其次将堆顶与堆的最后一个位置交换,重复前两步。难点在与每次堆的建立。每次建立都从数组的索引位置 (length/2 - 1)开始 到索引位置0为止,<length为待堆排序的的数组部分的长度>,确保父节点的值大于它的左右两个儿子(可能只有一个),依次类推。注意:因为是倒的排序,所以不需要严格意义上的堆,只要保证在当前的父节点比它的儿子大就能满足要求。
代码:
#include<stdio.h> #include<windows.h> //针对堆进行调整 void HeadAjust(int data[],int length) { int nChild; int nTemp; int flag; int i; i = (length/2-1); for(;i>=0;i=flag) { nTemp=data[i]; nChild = 2*i+1; if(nChild<length-1 && data[nChild+1]>data[nChild]) { nChild++; } if(nTemp<data[nChild]) { data[i] = data[nChild]; data[nChild] = nTemp; } flag = i - 1; } for(i=0;i<length;i++) { printf("%d\t",data[i]); } printf("\n\n"); } //堆排序 void HeadSort(int data[],int length) { int j; int temp; HeadAjust(data,length); for(j=length-1;j>0;--j) { temp = data[j]; data[j] = data[0]; data[0] = temp; HeadAjust(data,j); } } int main() { int a[] = {46,79,56,38,40,84}; int n= 6; int i; for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n\n"); HeadSort(a,n); for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n"); system("pause"); return 0; }