数组选择排序

 

如上数组

选择排序的实现条件就是设置两个指针(次指针不是数据类型的指针而是int类型的值指向数组的下标)两个指针从最左端开始向右遍历,遍历结束一个指针指向该数组最大的值一个指针指向数组最小的值,将最大的值与与数组最右端的数据交换,将最小的值与数组最左端数据交换。

 交换完了之后数组两端之后不再移动忽略两端

 

将剩下的数组循环上述操作

一直到最右端和最左端都是同一个数组元素停止操作

此时数组已完成排序 

这种方式还存在一些bug

那就是当这种情况时

最大的数在最左端max指针不移动,如果将最小的数与最左端的数交换,那么max指向的数值将会发生改变,那么最右端将不会是最大值而是最小值,排序存在BUG。

当出先这种情况时我们需要设立一个特殊情况时的特殊处理。

当,max指向数组最左端时,我们将min指向的值与最右端的值交换,再将最右端的值与最左端的值交换,这样便修复了BUG。

代码实现

​
void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void SelectSort(int* a, int n)
{
	int left = 0, right = n - 1;
	while (left < right)
	{
		int min = left;
		int max = left;
		for (int i = left; i <= right; i++)
		{
			if (a[i] > a[max])
			{
				max = i;
			}
			else if (a[i] < a[min])
			{
				min = i;
			}
		}
		if (max == left)
		{
			swap(&a[min], &a[right]);
			swap(&a[left], &a[right]);
		}
		else
		{
			swap(&a[min], &a[left]);
			swap(&a[max], &a[right]);
		}
		left++;
		right--;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值