排序--SelectSort优化

SelectSort:(以升序为例)
    选择排序的基本思想:初始时,有序区为0,每一趟在无序区中选出一个关键字最小的元素,然后与无序区第一个元素交换,然后无序区减1,有序区加1,直到记录全部排完。
    直接选择排序:第一趟排序在R[0..n]中选出一个关键字最小的与R[0]交换,第二趟在R[1..n]中选择一个最小的与R[1]进行交换,以此类推直到无序区的记录只剩一个时排序完成。



    要知道"比较"与"移位"相比,移位更花费时间,所以直接选择排序相比于插入排序来说,能更好一点。

根据上面思想,我们可以写出直接选择排序的一般代码:

void SelectSort(int *arr , int len)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int tmp = 0;
	for (i = 0; i < len-1; i++)
	{
		k = i;
		for (j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[k])   //寻找无序区最小的元素的下标
			{
				k = j;
			}
		}
		if (k != i)              //如果寻找的元素下标不等于有序区最后一个元素下标则交换
		{
			tmp = arr[i];
			arr[i] = arr[k];
			arr[k] = tmp;
		}
	}
}






优化:上面的代码中,查找无序区中的最小值我们写了一个for循环完成,其实这里还可以优化。我们可以再这里同时查找最小值和最大值,最后将最小值放到前面的位置,最大值放到后面的位置。




根据上面的分析,可以写出如下代码:

void SelectSort(int *arr, int len)
{
	int left = 0;
	int right = 0;
	int j = 0;
	int tmp = 0;
	int max = 0;
	int min = 0;
	for (left=0,right=len-1 ; left<right ;  right--,left++)
	{
		min =left;
		max = left;
		for (j = left + 1; j <=right; j++)
		{
			if (arr[j] < arr[min])   //寻找无序区最小的元素的下标
			{
				min = j;
			}
			if (arr[j]> arr[max])   //寻找无序区最大的元素的下标
			{
				max= j;
			}
		}
		if (min!= left)              //如果寻找的最小元素下标不等于有序区最后一个元素下标则交换
		{
			tmp = arr[left];
			arr[left] = arr[min];
			arr[min] = tmp;
		}
		if (max == left)        //如果最大元素的下标是有序区最后一个元素的下标,此时min存放的最大值
		{
			max = min;           //将max置为最大值
		}
		if (max !=right)   //如果max没在无序区右边,则将max对应的值放在右边
		{
			tmp = arr[right];
			arr[right] = arr[max];
			arr[max] = tmp;
		}
	}
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值