选择排序
选择排序和冒泡排序类似都是和相邻的比较,但不同的是它不交换数字而只交换下标。
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;
}
这就是每次循环产生的结果,红色是每次交换的数