堆排序
#include<stdio.h>voidShow(intarr[],intn){inti;for(i=0;i<n;i++)printf("%d",arr[i]);printf("\n");}//交换数组元素位置voidSwap(int*num_a,int*num_b){inttemp=*num_b;*num_b=*num_a;*num_a=temp;}//创建大根堆算法voidHeapAdjust(inta[],intstart,intend){inti,temp;temp=a[start];for(i=2*start+1;i<end;i=i*2+1){if(i+1<end&&a[i]<a[i+1])//右孩子大于左孩子,下标在右孩子上,否则下标在左孩子上i++;//i代表左右孩子中较大值得下标if(temp>a[i])//根比左右都大,跳出循环break;else{a[start]=a[i];//把孩子子树中最大的值放在父节点start=i;}}a[start]=temp;}int*HeapBuild(intarray[],intlength){inti;for(i=length/2-1;i>=0;i--){HeapAdjust(array,i,length);}returnarray;}//堆排序算法int*HeapSort(inta[],intlength){inti;a=HeapBuild(a,length);for(i=length-1;i>0;i--){Swap(&a[0],&a[i]);HeapAdjust(a,0,i);}returna;}intmain(){//测试数据int*a;intarr_test[10]={8,4,2,3,5,1,6,9,0,7};Show(arr_test,10);a=HeapSort(arr_test,10);Show(a,10);return0;}优化:#include<stdio.h>#include<stdlib.h>int*DuiPaixu(inta[],intn){intend=n,i,t,x,y;while(end>=1){while(1){intflag=0;i=end/2;while(i>0){if(a[i]<a[2*i]){t=a[i];a[i]=a[2*i];a[2*i]=t;flag=1;}if(2*i+1<=end&&a[i]<a[2*i+1]){x=a[i];a[i]=a[2*i+1];a[2*i+1]=x;flag=1;}i--;}if(!flag)break;}y=a[1];a[1]=a[end];a[end]=y;end--;}returna;}voidPrint(inta[],intn){inti;for(i=1;i<=n;i++){printf("%5d",a[i]);}}intmain(void){intn,i;int*a;printf("请输入数组长度n=");scanf("%d",&n);a=(int*)malloc(n*sizeof(int));printf("请输入数组元素:");for(i=1;i<=n;i++){scanf("%d",&a[i]);}a=DuiPaixu(a,n);Print(a,n);return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。