选择排序----c++实现

选择排序

选择排序和冒泡排序类似都是和相邻的比较,但不同的是它不交换数字而只交换下标。

for (int i = 0; i < len; ++i)
	{
		int min = i;//定义最小值的下标,
		for (int j = i; j < len-i; ++j)//区别于冒泡的len-1-i,因为j不会越界
//之所以冒泡和选择都要len-i是因为最大的是已经和所有的数比较过得出来的,所以它排好了就不
//用再去花费时间再比一次,这里是最小的是已经和所有的数比较过得出来的
		{
			if (arr[j] < arr[min])//用最小值下标和所有数字比较,但是不交换,得出最小的
			{
				min = j;
			}
		}

升序排列
举一个例子4 2 3 1;a[0]=4,a[1]=2,a[2]=3,a[3]=1
注意一下min=i;我们每次都把第i次循环的i作为下标
这是为什么呢?我们选出了最小值就要把它排在前面
i=0时排好a[0]处的数,下次就从i=1处开始排,把i=1最为最小值
这也时为什么内存循环中j=i的原因

循环开始 min=i=0,故一开始设定的最小值就是a[0]=4,进入if判断语句
内层循环都是j=i开始的,i=0
arr[j] < arr[min],4和4比较,不满足条件,min=0;
j++;j=1;继续if判读语句
arr[j] < arr[min],2和4比较,满足条件,min=j=1;
j++;j=2;继续if判断语句
arr[j] < arr[min],3和2比较,不满足条件,min=1
j++;j=3;继续if判断语句
arr[j] < arr[min],1和2比较,满足条件,min=j=3;
此时内层循环结束,执行下面的代码
可以看出,所有的数字都进行了比较,然后得出了最小值的下标min=3

if (min != i)//如果下标交换过了,所以
		{
			int temp = arr[i];
			arr[i] = arr[min];
			arr[min] = temp;
		}

min一开始被设定为i,如果下标交换过那么说名a[i]比a[min]小呗,而且是从i开始的最小值。那么就交换。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
	
void Selectsort(int arr[], int len)
{
	for (int i = 0; i < len; ++i)
	{
		int min = i;//定义最小值的下标,
		for (int j = i; j < len-i; ++j)//区别于冒泡的len-1-i,因为j不会越界
//之所以冒泡和选择都要len-i是因为最大的是已经和所有的数比较过得出来的,所以它排好了就不//用再去花费时间再比一次
		{
			if (arr[j] < arr[min])//用最小值下标和所有数字比较,但是不交换,得出最小的
			{
				min = j;
			}
		}

		if (min != i)//如果下标交换过了,所以
		{
			int temp = arr[i];
			arr[i] = arr[min];
			arr[min] = temp;
		}
	}
}


int main(void)
{
	int arr[10];
	for (int i = 0; i < 10; ++i)
	{
		arr[i] = 9 - i;
	}
	int len = sizeof(arr) / sizeof(int);
	cout << len << endl;
	Selectsort(arr, 10);
	for (int i = 0; i < 10; ++i)
	{
		cout << arr[i] << " ";
	}
	system("pause");
	return 0;
}

这就是每次循环产生的结果,红色是每次交换的数
这就是每次循环产生的结果,红色是每次交换的数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值