思想:
选择所有数字中最小的数字,与待排序的第一个交换
思路演绎:
原始数据: 3 5 8 6 7 9
第一趟:3 5 8 6 7 9
第二趟:3 5 8 6 7 9
第三趟:3 5 6 8 7 9
第四趟:3 5 6 7 8 9
第五趟:3 5 6 7 8 9
时间复杂度:O(n^2) //两个for循环,条件均为++
空间复杂度:O(1) //没有扩展新空间
稳定性:不稳定 //有跳跃式交换
代码实现:
//选择排序
void SelectSort(int* arr, int len)
{
int minIndex;
int temp;
//1.遍历数组
for (int i = 0; i < len - 1; i++)//len-1是最后一个len值没必要再交换
{
minIndex = i;// minIndex = 0不对,每次最小值应该赋值为待排序中的第一个
//2.内层for循环j找到待排序中的最小值
for (int j = i + 1; j < len; j++)//此时是len,不是Len-1,是因为要在所有数据内找min值
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
//3.找到最小值后与待排序的第一个值(也就是i位置)交换
if (minIndex != i)//可以优化一下代码
{
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
void Show(int* arr,int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 6,4 ,7,8,10,-5,90,34,55};
Show(arr,sizeof(arr) / sizeof(arr[0]));
printf("\n ");
SelectSort(arr, sizeof(arr) / sizeof(arr[0]));
Show(arr, sizeof(arr) / sizeof(arr[0]));
}
运行结果: