选择排序
选择排序其实是冒泡排序的升级版,将必要的交换次数从O(N^2)减少到O(N),但是它的比较次数依然是O(N^2)。
描述:
定义一个变量(temp)用于记录最小值(最大值)的下标,然后循环数组并比较,记录每次比较时所产生的较小(大)的那个值所在的下标,
下次比较时就是拿temp变量中记录的那个下标的值去比较,一轮结束后temp就会记录最小(大)的那个值的下标,
最后与"i"交换位置。
看图其实更明显
顺便在帖个代码先~
public class SelectSort {
int[] arr = {10,45,78,1,32,46,98,75,64,22};
@org.junit.Test
public void sort(){
for( int i=0; i<arr.length; i++ ){
int temp = i;//用于保存最小值的下标
for( int j=i+1; j<arr.length; j++ ){
if(arr[temp] > arr[j]){
temp = j;//下标移动的较小值的位置
}
}
if(temp != i){
int t = arr[i];
arr[i] = arr[temp];
arr[temp] = t;
}
}
display();
}
public void display(){
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
总结:
这里有一个不变性,就是已经排好序的数据项,我不知道该怎么写,就用了个i来代替^_^。
选择排序和冒泡排序执行了相同次数的比较: N*(N-1)/2。然而对于N个数据项,选择排序最多也就只需要交换N-1次,但是冒泡排序最多却需要交换N^2次。所以选择排序的效率也就高于冒泡排序。