一.算法思路
总是选择在未排序的一群数中最小的数来放到已排序的那些数的后面,即把它放到未排序数的最前面,现在它成了已排序的一部分。
注意:已排序的那部分是全局的排序,就是说,他不会被冲中间插入,是全局排序,最终排序的前面那一部分,而不是像插入排序那样,可能与最终排序结果不太一样。
步骤:先是选出最小的一个元素与第一个位置的元素交换,接着,选出第二小的元素与第二个位置的元素交换;
二.伪代码
selectionsort(a [])
for i=0 to data.length-2 //可以看作是从这些元素中选出一个元素去放到a[i]这个位置
从data[i],.....data[data.length-1]中选出最小的元素
将它与a[i]交换 //注意是与a[i]交换,第o次循环结束后才有1个元素被排好,在第i次循环中,有个i元素被排好
注解:i的最后一个值为n-2,因为如果除了最后一个元素都正确放置,即被选作最小的数放置,则剩下的最后一个数a[n-1]是最大的值。
三.代码实现
/**
* @author garypotter
* @version 创建时间:2016年4月2日 下午3:14:02
* @TODO
* 类说明
*/
public class SelectionSort {
public static void main(String[] args) {
Object[] a={5,2,3,8,1,9,10,13,4,11};
selectionsort(a);
System.out.println("result:"+a[0]+" "+a[1]+" "+a[2]+" "+a[3]+" "+a[4]+" "+a[5]+" "+a[6]+" "+a[7]+" "+a[8]+" "+a[9]);
}
public static void selectionsort(Object[] a){
int i,j,least;
for(i=0;i<a.length-1;i++){
for(j=i+1,least=i;j<a.length;j++){
if(((Comparable)a[j]).compareTo(a[least])<0){
least=j;
}
}
if(least!=i){
swap(a,least,i);
}
}
}
public static void swap(Object[] a,int m,int n){
Object temp=a[m];
a[m]=a[n];
a[n]=temp;
}
}
四.分析
外部循环执行n-1次,对于每个介于0和n-2的i,外部循环j=(n-1)-i次,共比较n(n-1)/2次,再加上if语句中i和least的n-1次比较,这个次数对于所有情况都是相同的,可以节约的只有交换次数。
最好情况,已经有序,不需要交换。最坏情况,当最大的元素在第一个位置,而剩下元素都有序(最大元素始终会在未排序的所有元素的最前面,每次选出最小的元素都需要和它进行交换),交换次数等于外部循环的迭代次数n-1,即最坏情况需要移动3(n-1)次(每次都需要交换)。