1.算法思想
在一组数列中选择最小的放在数列的第一个位置,再从剩下的数列中找最小的放在第二个位置,以此类推,依次找到到最小的数。
在实现的过程中:
我们可以先设第一个元素为最小的数,设一个指针min指向第一个元素;
然后将这个数与后面的数作比较,若后面有数小于这个数,则将指针指向这个更小的数,以此类推,整个比较下来,min就指向了整个数列中最小的数;
每一轮都按照这个方法,因此我们可以分析出,总共需要两层循环,第一层是要选择为序列的第几位找出最小数,第二层循环是选出这个最小的数是几。
2.算法实现
#include<stdio.h>
#define MAX 20
void choice (int array[],int len)
{
int i,j,temp;
int min;
for(j = 0;j < len-1;j++) //这层循环控制的是轮数
{
min = j; //设最左边的值为最小值
for(i = j+1;i < len;i++) //从第二个值开始依次与最小值比较
{
if(array[i] < array[min]) //当有比array[min]更小的值时
min = i; //将i赋给min
} //这层循环结束后,找到本轮最小值array[min]
temp = array[j];//将刚开始设的最小值与现在找出来真正的最小值调换位置
array[j] = array [min];
array[min] = temp;
}
printf("排序后为:\n");
for(j = 0;j < len;j++)
printf("%d ",array[j]);
}
void main()
{
int i;
char ch;
int a[MAX];
int count = 0;
printf("请输入要排序的数\n");
for(i = 0;ch != '\n';i++)
{
scanf("%d",&a[i]);
ch = getchar();
}
choice(a,i);
}
3.算法分析
简单选择排序中,需要进行的比较次数与初始状态下待排序数列的排序情况无关,当i = 1时,需要进行n - 1次比较,当i = 2时需要进行n - 2次比较,因此进行比较操作的时间复杂度为O(n²)。
在交换记录时,需要一个辅助空间,因此空间复杂度为O(1)。