堆排序

[]( ̄▽ ̄)* giao起来。


1.堆排序

升序 需要转换成大根堆

arr[i]>arr[2*i+1] && arr[i]>arr[2*i+2]

降序 需要用转换成小根堆

arr[i]<arr[2*i+1] && arr[i]<arr[2*i+2]
143 void reheap(int arr[],int index,int n){	//对arr[index]及其子结点 转换成大根堆的形式
144     int child = 2*index+1;
145     int key = arr[index];
146     while(child<n){			//child结点存在
147         if(child+1<n && arr[child] < arr[child+1]){		//右孩子存在且大于左孩子,其目的就是找一个最大值的下标赋给index
148             ++child;
149         }
150         if(key<arr[child]){			//把child作为index继续向下判断
151             arr[index]=arr[child];
152             index=child;			//把child作为父结点index
153             child = 2*index+1;		//继续找孩子中的最大值
154         }else{
155             break;
156         }
157     }
158     arr[index]=key;			//这个不能忘了,相当于交换了
159 }
160 
161 void heap_sort(int arr[],int n){
162     int i;
163     for(i=n/2;i>=0;--i){	//i为第一个非叶子结点
164         reheap(arr,i,n);    
165     }						//到这里已经是一个大根堆的形式了
166     for(i=0;i<n-1;i++){		//每次去掉一个末尾的最大值,即把根节点与最后一个叶结点交换,
167         int mid = arr[0];	
168         arr[0] = arr[n-i-1];
169         arr[n-i-1] = mid;
170         reheap(arr,0,n-1-i);		//把第二大的结点作为根节点。
171     }
172 }

	https://www.cs.usfca.edu/~galles/visualization/HeapSort.html
	上面有具体步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值