堆排序

先理解下什么叫堆,然后下理解代码:https://www.cnblogs.com/chengxiao/p/6129630.html(Ctrl+鼠标左键)

using namespace std;
#include<string.h>
#include<assert.h>
#include <algorithm>
#include <iostream>
void BuildSmallHeap(char* arr, int n, int parent)                          //向下调整
{
	int child = parent * 2 + 1;        //子节点(左节点)
	while (child<n){
		if (child+1<n&&arr[child + 1]>arr[child])     //child为左节点,判断左右节点大小保证右节点在排序序列内
		{
			child++;                       //如果右节点大于左节点,左节点++
		}
		if (arr[child] > arr[parent]){          //判断子节点是否大于父节点
			swap(arr[child], arr[parent]);
			parent = child; child = parent * 2 + 1;
		}
		else{
			break;                                     //如果大于交换		                           
		}                                    // child赋值后大于n,跳出循环

	}
}
void HeapSort(char* arr,int len){
	assert(arr);
	assert(len);
	int parent = (len - 2) >> 1;             // 找出第一个非叶节点  len/2-1也可以,且循环所有的非叶节点,此次循环为3次,parent=2
	for (; parent >= 0; --parent){
	    BuildSmallHeap(arr, len, parent);
	}
	
	for (int i = len-1; i >=0;i--){
		                                       //保证最后一个数为最大的,且除了最后一个数,重新循环建立小堆
	  swap(arr[0], arr[i]);                  //堆顶与最后一个数交换
	  BuildSmallHeap(arr, i, 0);
		
	}
}
	int main(){
		char arr[] = "512784";
		int len = sizeof(arr) - 1;
		HeapSort(arr, len);
		cout << len << endl;
		cout << arr << endl;
		system("pause");
		return 0;
	}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值