排序思路:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然后在剩下的數當中再找最小的與第二個位置的數交換,如此循環。
算法實現:
public static void selectSort(int arr[]){ int temp; for(int i = 0;i < arr.length-1; i ++){//有N個元素只需比較N-1次 int min = i;//記住初始位置 for(int j = i+1; j < arr.length; j ++){//在 [i+1,arr.length) 中選最小元素,注意這里的i+1和arr.lenth均為元素下標 if(arr[j] < arr[min]) min = j;//min記下目前找到的最元素的下標 if(min != i){ //每趟比較中元素之間只進行一次交換,即元素移動3次。 temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } } public static void main(String[] args) { int array[] = {2,1,1,5,2}; System.out.println("排序之前:"); for(int element : array){ System.out.print(element+" "); } selectSort(array); System.out.println("\n排序之后"); for(int element : array){ System.out.print(element+" "); } } }
算法分析:1.在選擇排序中,無論元素的初始序列如何,都要進行 (n-1)+(n-2)+(n-3)+....+1 = n*(n-1)/2 = O(n2)次比較,所以時間復雜度為O(n2) n為元素個數
2.當元素的初始序列為正序時,移動次數為0,而當元素的初始序列為反序時,總的移動次數為:3*總趟數,即Mmax = 3*(n-1)
3.在直接選擇排序中只使用了i,j,min這3個輔助元素,與問題規模無關,所以空間復雜度為O(1).
4.當元素序列類似[8,5,8,1]時,在第一趟比較中第一個元素8和最后個元素1進行了交換,元素中的兩個8的相對位置發生了改變,所以直接選擇排序是一種不穩定排序。