算法思想:每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个元素。
在第一趟选择排序中,从第一个元素开始,通过n-1次比较,从n个元素的序列中选出关键字最小的元素,并和第一个元素进行交换。
在第二趟选择排序中,从第二个元素开始,通过n-2次比较,从n-1个元素的序列中选出关键字最小的元素,并和第二个元素进行交换。
......
在第i趟选择排序中,从第i个元素开始,通过n-i次比较,从n-i个元素的序列中选出关键字最小的元素,并和第i个元素进行交换。
如此反复,经过n-1趟简单选择排序,将n-1个元素排列到位,剩下最后一个元素直接在最后。
举例:10 7 8 25 31 11 9 1 21 18
第一趟 :从第一个元素开始通过n-1次即9次比较,找到最小元素1,将a[7]=1与a[0]=10交换:
1 7 8 25 31 11 9 10 21 18
第二趟:从第二个元素开始通过n-2次即8次比较,找到最小元素7,即a[1]本身不进行交换:
1 7 8 25 31 11 9 10 21 18
第三趟:从第三个元素开始通过n-3次即7次比较,找到最小元素8,即a[2]本身不进行交换:
1 7 8 25 31 11 9 10 21 18
第四趟:从第四个元素开始通过n-4次即6次比较,找到最小元素9,将a[6]=9与a[3]=25交换:
1 7 8 9 31 11 25 10 21 18
第五趟:从第五个元素开始通过n-5次即5次比较,找到最小元素10,将a[7]=10与a[4]=31交换:
1 7 8 9 10 11 25 31 21 18
第六趟:从第六个元素开始通过n-6次即4次比较,找到最小元素11,即a[5]本身不进行交换:
1 7 8 9 10 11 25 31 21 18
第七趟:从第七个元素开始通过n-7次即3次比较,找到最小元素18,将a[6]=25与a[9]=18交换
1 7 8 9 10 11 18 31 21 25
第八趟:从第八个元素开始通过n-8次即2次比较,找到最小元素21,将a[7]=31与a[8]=21交换
1 7 8 9 10 11 18 21 31 25
第九趟:从第九个元素开始通过n-9次即1次比较,找到最小元素25,将a[8]=31与a[9]=25交换
1 7 8 9 10 11 18 21 25 31
排序结束得到最终排序结果:1 7 8 9 10 11 18 21 25 31
核心代码:
void selectSort(int a[],int n)
{
int i,j,k,t,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[k])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
算法分析:
最好情况:即待排序序列初始状态即为正序,不需要移动元素。
最坏情况:第一个元素最大,其余元素从小到大依次排列,此时移动次数最多为3(n-1)次。
选择排序中进行的比较次数与初始状态下待排序元素序列的排列情况无关。当i=1时,进行n-1此比较,当i=2时进行n-2次比较,以此类推,共进行比较次数为:
因此时间复杂度为O(n^2);
只需要一个辅助空间来存储元素,因此空间复杂度为O(1);
同时,选择排序是不稳定排序。
C语言可运行代码:
#include<stdio.h>
void selectSort(int a[],int n)
{
int i,j,k,t,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[k])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
printf("第%d轮排序后的结果:",i+1);
for(t=0;t<n;t++)
printf("%-4d",a[t]);
printf("\n");
}
}
int main(){
int a[10];
printf("please enter 10 numbers:\n");
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
printf("the array before sort:\n");
for(int i=0;i<10;i++)
printf("%-4d",a[i]);
printf("\n");
selectSort(a,10);
printf("the array after sort:\n");
for(int i=0;i<10;i++)
printf("%-4d",a[i]);
return 0;
}
运行结果:
java可运行代码:
package one;
import java.util.Scanner;
public class selectSort {
public static void main(String[]args){
Scanner input=new Scanner(System.in);
int[]a=new int[10];
System.out.println("please enter 10 numbers");
for(int i=0;i<a.length;i++)
a[i]=input.nextInt();
System.out.println("the array before sort:");
print(a);
System.out.println();
sort(a);
System.out.println("the array after sort:");
print(a);
}
public static void print(int []a){
for(int i=0;i<a.length;i++)
System.out.printf("%-4d",a[i]);
}
public static void sort(int []a){
int i,j,k,t,temp;
for(i=0;i<a.length-1;i++)
{
k=i;
for(j=i+1;j<a.length;j++)
{
if(a[j]<a[k])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
System.out.println("round of sorting:"+(i+1));
for(t=0;t<a.length;t++)
System.out.printf("%-4d",a[t]);
System.out.println();
}
}
}
运行结果: