(直接)选择排序和堆排序

选择排序

其思想是: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

图示:
在这里插入图片描述
代码实现:

void swap(int* arr, int num1, int num2)
{
	int temp = arr[num1];
	arr[num1] = arr[num2];
	arr[num2] = temp;
}

void SelectSort(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		int j = i;
		int min = i;
		for (; j < size; j++)
		{
			if (arr[min] > arr[j])
				min = j;
		}
		if (i != min)
			swap(arr, min, i);
	}
}

直接选择排序理解起来是很简单的,但是他的效率并不是很高,并且直接选择排序是不稳定的。其时间复杂度为O(N^2),空间复杂度为O(1)。

堆排序

堆排序也是选择排序的一种,利用堆这种数据结构的特性来进行的排序,这种排序主要应用于一些大数据我们只关心前10的这种数据,比如Top10的点击量,世界前十富豪,年级前100这样的一部分数据的特性时,选择堆排序来实现。

图示:
在这里插入图片描述
代码实现:

void Swap(int* left, int* right)
{
	int temp = *left;
	* left = *right;
	*right = temp;
}
//向下排序
//建立大根堆,最后得到的就是升序序列
void AdjustDwon(int* arr, int size, int parent)
{
	//确定该节点的左孩子的位置

	int child = parent * 2 + 1;

	while (child < size)
	{
		//找到俩个孩子中最大的孩子

		if (child + 1 < size && arr[child] < arr[child + 1])
			child += 1;

		//检测双亲是否大于最大的孩子

		if (arr[parent] < arr[child])
		{
			Swap(&arr[child], &arr[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
			return;
	}
}
void HeapSort(int* arr, int size)
{
	//建堆

	for (int root = (size - 2) >> 1; root >= 0; root--)
	{
		AdjustDwon(arr, size, root);
	}

	//开始排序

	int end = size - 1;
	while (end)
	{
		//交换
		Swap(&arr[0], &arr[end]);
		
		//排序
		AdjustDwon(arr, end, 0);
		end--;
	}
}

若要升序则建立大根堆,降序就建立小根堆。
堆排序也是一种不稳定的排序,但是对于一些情况下,堆排序的效率就会高很多,其时间复杂度为O(N*logN),空间复杂度为O(1)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值