寫在前面:
在這篇博客中,將會總結選擇排序算法的Java實現,分析選擇排序算法的時間複雜度,空間複雜度等。選擇排序算法的排序思想是,首先第一輪找到數組中最小的數字,並與數組索引爲0的元素交換,第二輪從索引爲1的位置開始尋找,同樣是找到數組中剩餘元素最小的元素,然後再與索引爲1的元素交換,依次類推。。。。。核心思想即:每一輪找到數組中最小的元素,插在前面,最後完成排序。
例如:數組int [] arr = new int [] {2,5,3,1,6,8,4,7}
- 第一次排序:找到數組中最小的元素1,交換到數組索引爲0的位置-----1,5,3,2,6,8,4,7
- 第二次排序:找到數組中最小的元素2,交換到數組索引爲1的位置-----1,2,3,5,6,8,4,7
- 第三次排序:找到數組中最小的元素3,交換到數組索引爲2的位置-----1,2,3,5,6,8,4,7
- 第四次排序:找到數組中最小的元素4,交換到數組索引爲3的位置-----1,2,3,4,6,8,5,7
- 第五次排序:找到數組中最小的元素5,交換到數組索引爲4的位置-----1,2,3,4,5,8,6,7
- 第六次排序:找到數組中最小的元素6,交換到數組索引爲5的位置-----1,2,3,4,5,6,8,7
- 第七次排序:找到數組中最小的元素4,交換到數組索引爲3的位置-----1,2,3,4,6,6,7,8
這樣通過尋找剩餘數組元素的最小值,並交換位置,就完成了選擇排序。
代碼實現:
package test1;
/**
* 選擇排序
*
* @ClassName Test1
* @Description
* @author McGRADY
* @date 2018年3月8日
*/
public class Test1 {
public static void main(String[] args) {
int[] arr = new int[] { 2, 5, 3, 1, 6, 8, 4, 7 };
sort(arr);
for (int i : arr) {
System.out.print(i);
}
}
public static void sort(int[] arr) {
int min;
int temp;
for (int i = 0; i < arr.length - 1; i++) {
min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (min != i) {
// 完成一次尋找最小數後,開始交換位置
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
}
時間複雜度分析:
通過上面的實例分析,我們可以看出,無論數組的順序如何,選擇算法的比較次數都要執行(n-1)+(n-2)+......+1次,也就是=n*(n-1)/2次,即與數組的順序無關。
而數組的交換次數則與數組的初始順序有關。當數組正序的時候,數字交換次數爲0.而當數組反序的時候,交換次數爲n/2,最壞情況下,將會交換n-1次。
那麼,最好情況下:程序會執行0+n*(n-1)/2次,時間複雜度爲O(n^2).
那麼,最壞情況下:程序會執行n-1+n*(n-1)/2次,時間複雜度爲O(n^2).
總結:無論是最好情況還是最壞情況,時間複雜度都是O(n^2).
空間複雜度分析:
由於程序中採用兩個臨時變量交換,所以空間複雜度爲一個常數,O(1).