选择排序(Selection sort)
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完一次循环,他的平均时间复杂度是О(n²)
以一次循环为例:arr[0]中的值分别与arr[1]~arr[3]中的值比较,则进行三次比较,结果流程如下:
/ | arr[0] | arr[1] | arr[2] | arr[3] |
---|---|---|---|---|
第一次 | 3 | 4 | 2 | 1 |
第二次 | 2 | 4 | 3 | 1 |
第三次 | 1 | 4 | 3 | 2 |
这里由于是从小到大,所以选取了数组里最小的元素出来,排在了起始位置。
那么,假设数组arr.length=n,只要唯一确定前n-1或后n-1个数就可以完成对数组的排序。那么最外层循环可以确定:n-1次外层。
内层循环确定:
第一次比较要(n-1)次
第二次比较要(n-2)次
………………..
倒数第二次要2次
最后一次需要1次,因为最后一个数不需要自己和自己比较。
1.若从前往后排序
要排好arr[0]~arr[n-2]共n-1个数就可以确定这个有序数组了。
public class SelectSort {
public static void selectSort1(int a[]){
//两层循环,最外层确定n-1次即可完成排序
for(int i=0;i<a.length-1;i++){
//内层排序,次数从n-1到1
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
System.out.println("********");
for(int m=0;m<a.length;m++){
System.out.print(a[m]+" ");
}
System.out.println();
}
}
}
public static void main(String args[]){
//测试实例
int []arr1 = {
4,3,2,1,0};
selectSort1(arr1);
System.out.print("结果是");
for(int a=0;a<arr1.length;a++){
System.out.print(arr1[a]+" ");
}
}
}
运行过程及结果: