选择排序:
时间复杂度:无论什么数据排序,时间复杂度都是 O(n²) 。
优点:与冒泡排序相比,交换移动数据的次数相当少,每趟只交换一次,不占用额外的内存空间。
主要思路:从头至尾扫描序列,找出最小的一个元素后,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
算法过程举例:
原始序列:45,24,75,66,32
1)第一趟,将第一个数组元素45的下标赋给min,逐次与后面的元素比较,发现24比45小,则当前最小的元素为24,将24的数组下标赋给min,继续往后比较,发现整个序列中最小的元素是24,则将24与45交换;
a[0]=45,a[1]=24,min=0;a[0]>a[1],则min=1........min总是表示最小元素的下标,最后交换a[0]和a[min];
第一趟比较:{ 24},{45,75,66,32} 前面是排序好的序列,后面是未排序的序列
2) 第二趟,将第二个元素45的下标赋给min,逐次与后面元素比较,发现75比45大,则45仍然是最小元素,继续比较,最后发现32比45小,则32是当前序列最小元素,将32元素下标赋给min,最后将45与32交换;
a[1]=45,a[2]=75,min=1;a[1]<a[2],min=1..........a[4]=32,a[1]>a[4]=32,min=4,交换a[1]和a[4]
扫描二维码关注公众号,回复:
15511127 查看本文章
第二趟比较:{ 24,32},{ 75,66,45}
3)继续重复上述步骤,共进行N-1趟比较
原始序列 | 45 | 24 | 75 | 66 | 32 | 当前序列最小值24 |
第一趟比较 | 24 | 45 | 75 | 66 | 32 | 剩下序列最小值32 |
第二趟比较 | 24 | 32 | 75 | 66 | 45 | 剩下序列最小值45 |
第三趟比较 | 24 | 32 | 45 | 66 | 75 | 剩下序列最小值66 |
第四趟比较 | 24 | 32 | 45 | 66 | 75 | 排序完成 |
共进行N-i趟比较,每趟都是先找出最小元素,得到最小元素下标后,将其与未排序的第一个元素交换
具体程序:
#include<stdio.h>
void swap(int a[],int b[]) //将交换部分单独写成函数
{
int temp=*a;
*a = *b;
*b = temp;
}
void selection_sort(int a[],int len) //选择排序
{
int i,j;
for(i=0;i<len-1;i++) //控制趟数
{
int min=i; //将当前未排序元素的下标赋给min
for(j=i+1;j<len;j++) //找出未排序序列中最小元素的下标
{
if(a[j]<a[min])
min=j; //将当前最小元素下标赋给min
}
swap(&a[i],&a[min]); //交换当前趟次比较找出的最小元素
}}
int main()
{
int i,m;
int a[]={45,24,75,66,32};
m=sizeof(a)/sizeof(a[0]); //计算数组元素的个数
printf("排序前:");
for(i=0;i<m;i++)
{
printf("%d ",a[i]);
}
selection_sort(a,m);
printf("\n排序后:");
for(i=0;i<m;i++)
{
printf("%d ",a[i]);
}
while(1);
}
运行结果: