常见排序算法之选择排序

发布时间:2020-07-27 21:02:05 作者:duanjiatao
来源:网络 阅读:413

常见排序算法之选择排序

常见排序算法之选择排序

1.直接选择排序

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

设数组为a[0…n-1]。

1.      初始时,数组全为无序区为a[0..n-1]。令i=0

2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。

3.      i++并重复第二步直到i==n-1。排序完成

这里直接给出一种比较优化的直接选择排序,每次遍历选出最大值和最小值

void SelectSort(int* a, size_t n)  //选择排序优化版
{
	assert(a);

	for (int left = 0, right = n - 1; left < right; ++left, --right)
	{
		int min = left;
		int max = right;

		for (int i = left; i <= right; ++i)
		{
			if (a[i] < a[min])
				min = i;
			else if (a[i] > a[max])
				max = i;
		}

		if (min != left)
		{
			std::swap(a[min], a[left]);

			if (max == left)
			{
				max = min;
			}
		}
		if (max != right)
		{
			std::swap(a[max], a[right]);
		}

	}
}

2.堆排序

将待排序的数组建立一个大堆,每次将堆顶的元素取出放在数组的最后一个位置上,再对数组的长度减1,然后对堆进行调整,使之仍然是一个大堆,直到堆的长度为1,将此元素放在数组的起始位置,排序完成。

void AdjustDown(int* a, size_t size, size_t root)
{
	assert(a);

	int child = root * 2 + 1;
	while (child < size)
	{
		if (child+1 < size && a[child + 1] > a[child])
		{
			++child;
		}
		if (a[child] > a[root])
		{
			std::swap(a[child], a[root]);
			root = child;
			child = root * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int* a, size_t n)
{
	assert(a);
	for (int i = (n-2)/2; i >=0 ; --i)
	{
		AdjustDown(a, n, i);  //建(大)堆
	}

	for (int i = n - 1; i > 0; --i)  //这样写比较好
	{
		std::swap(a[0], a[i]);
		AdjustDown(a, i - 1, 0);
	}

}

常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序常见排序算法之选择排序

推荐阅读:
  1. PHP排序算法:选择排序
  2. C言语选择排序算法及代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

算法 常见 排序

上一篇:sql turning advise的使用

下一篇:58、IPv6访问控制列表及ICMPv6简介

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》