堆排序与相关时间复杂度

堆排序

要进行堆排序首先要数据建立成堆,想了解建立堆的小伙伴可以查看我的另外一博客建堆。只需要看向下调整推和建堆两个小部分即可。
下面来讲如何实现堆排序:

首先我们来讲一下堆排序的思路:
假设由N个元素。建立一个堆,然后将最后一个元素和第一个元素交换,这样就将最大值或者最小值放在了最后。
然后将前N-1个元素建立成堆,再用第一个元素与第N-1个元素交换,循环到只有一个元素。

在这里插入图片描述

代码(升序)

#include<stdio.h>
#include<windows.h>


void Swap(int *px, int *py){
	int temp = *px;
	*px = *py;
	*py = temp;

}
//大根堆
static void AdjustDown(HDdatatype a[], int size, int parent){
	int child = parent * 2 + 1;//先假设左边的数比根数大
	while (child < size){//没有孩子结点退出
		if (child + 1 < size&&a[child] > a[child + 1]){//如果右边的数大,child++就得到右边数的下标
			child++;
		}
		if (a[child] < a[parent]){//如果孩子结点比父节点大就就交换
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else{//直到不小就退出
			break;
		}
	}
}


void HeadBuild(int a[],int num){
	for (int i = ((num - 1 - 1) / 2); i >= 0; i--){
		AdjustDown(a, num, i);//建立堆
	}


}

void HeadSort(int a[],int num){
	for (int i = num - 1; i > 0; i--){
		Swap(&a[0], &a[i]);//交换
		AdjustDown(a, i, 0);//向下调整,先交换,所以个数从i开始
	}
}


int main(){
	int a[] = { 27, 15, 18, 19, 35, 28, 65, 25, 49, 37 };
	int num = sizeof(a) / sizeof(a[0]);
	HeadBuild(a, num);//将一个数组建立成堆的形式
	HeadSort(a, num);//堆排序
	system("pause");
	return 0;
}

时间复杂度介绍

  1. 向下调整时间复杂度:

由于堆是一个完全二叉树,结点个数N有:N=2^H-1(不带括号,H是树高),就有H=log(N-1)。堆向下调整,最坏情况每一个都要调整,时间复杂度与高度有关所以时间复杂度是O(log(N))。

  1. 建堆的时间复杂度

建堆是从最后一个结点的父节点开始向下调整的,时间复杂度一般考虑最坏的情况,假设是满二叉树。所以有:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值