排序算法——选择排序
选择排序基本思想
选择排序(selection Sort)每一次在待排序数中选择最小的数,顺序放在已经拍好序的子文件中。直到所有的数全部排序成功。
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。选择排序相对来说比较简单。
2.基本过程
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
(1)在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
(2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
(3)以此类推,直到所有元素均排序完毕。
假如给定初始数据:(118,101,105,127,112)
一次排序:101,118,105,127,112
二次排序:101,105,118,127,112
三次排序:101,105,112,127,118
四次排序:101,105,112,118,127
C语言实现代码
void selectionSort(int a[],int n) //选择排序
{
int i,j,t,index;
for(i=0;i<n;i++)
{
t=a[i];
for(j=i;j<n;j++)
{
if(t<a[j]) //找到待排序数中最大(最小)的值
{
t=a[j];
index=j; //记录下标
}
}
if(t!=a[i]) //如果t的值发生改变说明有比a[i]更小(更大)的数
{
t=a[i];
a[i]=a[index];
a[index]=t;
}
}
}
int main()
{
srand(unsigned(time(NULL)));//随机数
int n,i,j,k;
scanf("%d",&n); //输入N为数组的个数
int a[n];
for(int i=0;i<n;i++) //获取随机数
{
a[i]=rand()%1001;
}
printf("排序前\n");
for(int i=0;i<n;i++) //排序前原数组
{
printf("%d ",a[i]);
}
printf("\n");
selectionSort(a,n);
printf("排序后\n");
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}