选择排序
所谓选择排序,明确目的就是寻找未确位置元素里面的最小元素的索引。用一个简单的例子来解释其思想,如数列arr={9,1,5,8,3,7,4,6,2},对数列进行遍历,i从0循环到8,我们令min=i。这里令min=i是为了在i从0循环到8时,逐渐确定第0,1,2…等位置的元素。先假设当前要确定的元素是未确定元素里面最小的元素,之后进行逐个比较,找到最小的元素,将其位置即索引赋给min。
先看代码。
public static void selectSort(int[] arr){
if(arr==null || arr.length < 2){
return;
}
for (int i=0;i<arr.length;i++){
int min = i;
for(int j=i+1;j<arr.length;j++){
min = arr[min]>arr[j]?j:min;
/*
if(arr[min] > arr[j])
min = j;
*/
}
swap(arr,min,i);
}
}
}
i从0循环到8,就是要逐个确定元素,后面还有个for循环是为了比较比arr[min]还要小的元素,从而得到最小元素的索引位置。
当i=0时,min=0,比较arr[min]与之后元素的大小,arr[1]>arr[min],即9>1,此时找到了比arr[min]要小的元素,将这个下标赋给min,即此时min=1,之后再将arr[min]与arr[2],arr[3]…比较,发现arr[min]是最小的,跳出第二个for循环,将0索引位置与min位置元素交换,{1,9,5,8,3,7,4,6,2}
当i=1时,0索引位置元素已确定,现确定1索引位置的元素,还是令min=i,即min=1,进入第二个for循环,arr[1]=9>arr[2]=5,min=2。下次循环,arr[min]<arr[3]=8未进行操作。在进行循环,arr[min]=5>arr[4]=3,进行索引赋值操作,min=4。在往后的逐个比较中,得到未确定的所有元素里面最小元素的索引为8,即min=8,将min位置元素与第二个元素交换,即{1,2,5,8,3,7,4,6,9}。
之后循环类似,逐个确定元素,与冒泡相比,选择排序是增加一个变量用来表示最小元素的索引,然后将要确定的位置与其交换。