原理:
内层循环遍历找到当前遍历数据中的最小或最大的数据,与外层循环当前下标数据进行比较,如果满足条件,选择是否交换对应下标的数据。
举例:
2 | 12 | 5 | 57 | 31 | 31 | 90 | 32 | 95 | 76 |
2 | 12 | 5 | 57 | 31 | 31 | 90 | 32 | 95 | 76 |
2 | 5 | 12 | 57 | 31 | 31 | 90 | 32 | 95 | 76 |
2 | 5 | 12 | 57 | 31 | 31 | 90 | 32 | 95 | 76 |
2 | 5 | 12 | 31 | 57 | 31 | 90 | 32 | 95 | 76 |
2 | 5 | 12 | 31 | 31 | 57 | 90 | 32 | 95 | 76 |
2 | 5 | 12 | 31 | 31 | 32 | 90 | 57 | 95 | 76 |
2 | 5 | 12 | 31 | 31 | 32 | 57 | 90 | 95 | 76 |
2 | 5 | 12 | 31 | 31 | 32 | 57 | 76 | 95 | 90 |
2 | 5 | 12 | 31 | 31 | 32 | 57 | 76 | 90 | 95 |
图中红色区域为内循环不遍历的区域,红色区域与白色区域相邻的红色区块为当前循环下确定的最小数据。
内循环执行一次后确定当前最小数据(5)的下标2,然后对下标2和下标0(数据2)进行比较,因为数据2大于数据5,所以不进行交换,从而确定最小数据为2。
内循环第二次后确定当前最小数据(5)的下标2,然后对下标2和下标1(数据12)进行比较,以为5小于12,所以进行交换,从而确定出当前最小数据为5。以此类推。
代码:
void SelectSort(int a[], int nlen)
{
int min;
for (int i = 0; i != nlen-1; ++i)
{
min = i;
for (int j = i + 1; j != nlen; ++j)
{
if (a[j] < a[min])
{
min = j;
}
}
if (min != i)
{
a[min] ^= a[i];
a[i] ^= a[min];
a[min] ^= a[i];
}
}
}
总结:
S(n)=(n-1)+(n-2)+...+(n-n)=(n-1)^2/2,时间复杂度为O(n^2)。