// // main.cpp // HeapSort // 堆排序算法 // Created by Harrison on 2022/8/9. // #include#include void swap(int &a,int &b){ //用作数组中的元素交换 int temp = a; a = b; b = temp; } void PrintArray(int *list,int size){ for(int t=1;t<=size;t++) { } for(int t=1;t<=size;t++) { printf("%dt",list[t]); } } void HeadAdjust(int *list,int k,int size){ //将元素k为根的子树进行调整 list[0]=list[k]; //list[0]暂存子树的根结点 for (int i=2*k; i<=size;i*=2) { //i=2*k的意思是指向左孩子,沿值较大的子结点向下筛选 if (i =list[i]) {//判断现存根结点是不是比最大的孩子结点还要大 break; //如果是,则说明现在根结点满足大根堆,跳出循环,执行下一个筛选 }else{ //此时孩子结点比根结点大 list[k]=list[i]; k=i; } } list[k]=list[0]; //被筛选结点的值放入最终位置 } void BuildMaxHeap(int *list,int size){ for (int i=size/2; i>0; i--) { //在非终端结点(i=[n/2]~1)上反复调整堆 HeadAdjust(list,i,size);//分别传入的是数组,当前子树最大非叶结点,数组长度 } } void HeapSort(int *list,int size){ BuildMaxHeap(list, size); //初始建堆 for (int i=size; i>1; i--) { //n-1趟的交换和建堆过程 swap(list[i],list[1]); //输出堆顶元素(和堆底元素交换 HeadAdjust(list, 1, i-1); //调整,把剩余的i-1个元素整理成堆 for(int t=1;t<=size;t++) { printf("%dt",list[t]); if (t==size) { printf("n"); } } } } int main(int argc, const char * argv[]) { int size,*list,i;//size是数组大小,list是数组,i用来计数 printf("请输入数组大小(存储n个元素需要长度为n+1,因为下标为0的用来存储根结点):"); scanf("%d",&size); list = (int*)malloc(sizeof(int)*size);//给list分配空间 printf("请输入%d个元素:n",size); for(i = 0;i < size;i++) scanf("%d",&list[i]); HeapSort(list, size-1); printf("排序后的结果是:n"); for(i=1;i<=size;i++) { printf("%dt",list[i]); } return 0; }
程序结果