排序——选择排序

基本思想

每一趟(第i趟,i=1,2,...,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素中只剩下1个元素,排序结束。

直接选择排序

操作步骤:

1)在元素集合array[i]——array[n-1]中选择关键码最小的数据元素

2)若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素交换

3)在剩余的array[i+1]——array[n-1]集合中,重复1)、2),直到集合剩下1个元素

程序代码:

//一次只选出关键码最小的直接排序
void DirectSecletSort1(int* array, int size)
{
	for (size_t i = 0; i < size -1; i++)
	{
		size_t minPox = i;//关键码
		for (size_t j = i + 1; j < size; j++)
		{
			//选出关键码最小的
			if (array[j] < array[minPox])
				minPox = j;
		}
		//交换数据
		if (minPox != i)
			swap(array[i], array[minPox]);
	}
}

//一次同时选择关键码最大的和最小的直接排序
void DirectSecletSort2(int *array, int size)
{
	int begin = 0;
	int end = size - 1;
	while (begin < end)
	{
		size_t i = begin;
		size_t maxPox = begin;
		size_t minPox = begin;
		//同时选出关键码最小的和最大的
		while (i <= end)
		{
			if (array[i] <= array[minPox])
				minPox = i;
			if (array[i] >= array[maxPox])
				maxPox = i;
			i++;
		}
		//交换数据
		if (minPox != begin)
			swap(array[begin], array[minPox]);
		if (maxPox != end)
			swap(array[end], array[maxPox]);
		if (begin == end)
			swap(array[minPox], array[maxPox]);
		begin++;
		end--;
	}
}

时间复杂度:O(N^2)

稳定性:不稳定锦

 

锦标赛排序

基本思想:首先取得n个元素的关键码,进行两两比较,得到n/2(向上取整)个比较的优胜者,作为第一步比较的结果保留下来。然后对这n/2(向上取整)个元素再进行关键码的两两比较,...,如此重复,直到选出一个关键码最小的元素为止。

一旦选择出这个元素,就需要在下次选择最小关键码之前把它的值改为最大值,使它再也不能战胜其他对手,此时需要重构胜者树得到新的优胜者,作为该排序下的下一个元素,重构的时间代价为lg(N)。

堆排序

1)创建堆:升序——大堆  降序——小堆

2)堆排序:用堆顶元素和最后一个元素交换,调整堆(最后一个元素不用调整)

a、把堆顶array[0]元素和当前最后一个元素(第一个非叶子结点为第一次的最后一个元素)交换

b、最大堆元素个数减1

c、由于第1步后根节点不在满足最堆的定义,向下调整根节点

d、循环a、b、c,知道数组为空

程序代码:

void Adjust(int *array, int size, size_t parent)//调整堆
{
	size_t child = parent * 2 + 1;
	while (child < size)
	{
		//右孩子存在且右孩子大于左孩子
		if ((child + 1 < size) && (array[child + 1] > array[child]))
		{
			child += 1;
		}
		if (array[parent] < array[child])
		{
			swap(array[parent], array[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
void HeapSort(int *array, int size)//堆排序
{
	//1.创建堆
	int root = (size - 2) >> 1;//size-2 = size-1-1
	for (; root >= 0; root--)
	{
		Adjust(array, size, root);
	}
	//2.堆排序
	size_t end = size - 1;
	while (end != 0)
	{
		swap(array[0], array[end]);//交换堆顶元素和最后一个元素
		Adjust(array, end, 0);
		end--;
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值