标签:
1.原理
待排序数组:[a1,a2,a3....an],通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录进行交换,当i等于n时所有记录有序排列。
2.实例
待排序数组:[3,4,1,5,2]
注:k用于存储元素的下标,元素进行两两比较时,没有进行多次换位,而是将较小元素的下标存于k中,当所有未排序的元素进行比较后,k即是最小元素的下标。
第一次外排序: 第二次外排序: 第三次外排序: 第四次外排序:
k=0 k=1 k=2 k=3
3<4 no----k=0; 4>3 yes---k=2; 3<5 no----k=2; 5>4 yes----k=4;
3>1 yes---k=2; 3<5 no----k=2; 3<4 no----k=2; 换值:
1<5 no----k=2; 3>2 yes---k=4; 此时k的值未变,不需要 a3=4,a4=5
1<2 no----k=2; 换值: 换值。 变换后:
换值: a1=2,a4=4; [1,2,3,4,5]
a0=1,a2=3; 变换后:
变换后: [1,2,3,5,4]
[1,4,3,5,2]
3.时间复杂度
在最好的情况下,交换0次,比较(n-1)n/2次,时间复杂度为O(n^2)。
在最坏的情况下,交换3n(n-1)/2次,比较n(n-1)/2次,时间复杂度为O(n^2)。
注:简单选择排序看似和冒泡排序的时间复杂度虽然相同,但是它的性能优于冒泡排序,原因如下:冒泡排序进行关键字的比较时,可能会交换两个记录的值,而简单选择排序只需将最小记录和被比较记录进行交换。即每次外排序时,简单选择排序交换值的次数不大于1,冒泡排序大于等于0。
4.代码
public class SelectSortTest {
//遍历数组
public static void Paixu(int a[]){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.print();
}
//简单选择排序
public static void Test(int a[]){
for(int i=0;i<a.length-1;i++){ //共计n-1次外排序
int k=i; //设k的初始值为i
for(int j=i+1;j<a.length;j++){
if(a[k]>a[j]){ //ak和后面的元素比较,符合要求则令k=j,直至找到最小元素下标
k=j;
}
}
if(k!=i){ //当最小元素下标发生变化时,将两记录换值
int temp=a[i];
a[i]=a[k];
a[k]=temp;
}
SelectSortTest.Paixu(a);
}
}
public static void main(String args[]){
int a[]={3,5,1,4,2};
SelectSortTest.Test(a);
}
}
标签:
原文地址:http://www.cnblogs.com/jfl-xx/p/4825251.html