方法一:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int arr[] = { 5, 7, 6, 4, 3, 8, 9, 2 };
int len = sizeof(arr) / 4;
int index = 0;
int i, j;
for (i = 0; i<len; i++)
{
int min = arr[i];
for (j = i; j<len; j++)
{
if (arr[j]<min)
{
min = arr[j];
index = j;
}
}
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
for (i = 0; i<len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
时间复杂度O(n^2)
例子:
5 7 6 4 3 8 9 2
第一次 2 7 6 4 3 8 9 5
第二次 2 3 6 4 7 8 9 5
第三次 2 3 4 6 7 8 9 5
第四次 2 3 4 5 7 8 9 6
第五次 2 3 4 5 6 8 9 7
第六次 2 3 4 5 6 7 9 8
第七次 2 3 4 5 6 7 8 9
原理:
每次遍历都选出最小的数字插到有序数字的后面,最小的数与要交换的数交换位置
方法二:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int arr[] = { 5, 7, 6, 4, 3, 8, 9, 2 };
int len = sizeof(arr) / 4; //数组长度
int i;
int index ; //记录最小值的下标
int k=0; //判断是否更改操作
//每次都把最小的数弄到外面
for (i = 0; i < len; i++)
{
int min = arr[i]; //将最小值设置为未排队的数组的第一个
for (int j = i; j < len; j++)
{
if (arr[j] < arr[i])
{
index = j; //找到最小值的下标 j ,将它赋给 index
int temp = arr[j]; //
min=arr[j]; //将最小值 arr[j] 暂时保存在temp,再赋值给min
arr[j] = temp; //
k = 1; //表示已更改最小值min
}
}
if (k == 1) //如果最小值min已更改才执行
{
for (int j = index - 1; j >= 0 + i; j--)
{
arr[j + 1] = arr[j]; //移动数组
}
arr[i] = min; //把最小值插入到准备排列的数后面
}
k = 0; //重置更新操作
}
for (int i = 0; i<len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
时间复杂度O(n^2)
例子:
5 7 6 4 3 8 9 2
第一次 2 5 7 6 4 3 8 9
第二次 2 3 5 7 6 4 8 9
第三次 2 3 4 5 7 6 8 9
第四次 2 3 4 5 7 6 8 9
第五次 2 3 4 5 6 7 8 9
原理:
每次都把未排序数字的最小值拿出来放到前面