1. 程式人生 > >Java: 排序 - 選擇排序

Java: 排序 - 選擇排序

選擇排序對於n個數的陣列,需要n-1次遍歷,時間複雜度n2,空間複雜度1。

n個數的陣列,升序選擇排序過程如下:

第一次遍歷,假設對映陣列最小值的下標minIndex為下標0,
從下標1到下標n-1作為排序佇列,輪流與下標min比較對映值,每當min的對映值大於對方,則min的下標被對方下標覆蓋。最後min下標的值與下標0互換,保證下標0對映當前排序佇列的最小值。

第m次遍歷(m<n-1),假設對映陣列最小值的下標min為下標m-1,
從下標m到下標n-1作為排序佇列,輪流與下標min比較對映值,每次如果min的對映值大於對方,則min的下標被對方下標覆蓋。最後min下標的值與下標m-1的值互換,保證陣列前m個數都排序完成。

第n-1次遍歷,將最後2個數排序後,整個陣列即為升序陣列

  public static boolean selectSort(int[] arr){
    int min;

    for (int i=0;i<arr.length;i++){
      min = i;
      for(int j=i+1;j<arr.length;j++){
        if(arr[j]<arr[min]){
          min = j;
        }
      }
      int tmp = arr[min];
      arr[min] = arr[i];
      arr[i] = tmp;
    }
return true; }

測試

int[] arr = {1,3,2,4,7,9,9,10,84,72,17,85,100,1,66,23};
selectSort(arr);
System.out.println(Arrays.toString(arr))

結果

[1, 1, 2, 3, 4, 7, 9, 9, 10, 17, 23, 66, 72, 84, 85, 100]

選擇和冒泡相比,對於長度n的陣列,每次遍歷發生的元素交換從n-1次降為1次,效能有很大提升。
但是缺點是固定需要n-1次遍歷,優點在於節省記憶體空間。