新手初入Java(六)數組的排序方式

對數組中的數據進行排序,主要有以下四種方法:

  • 冒泡排序
  • 直接插入排序
  • 選擇排序
  • Shell排序

(一)冒泡排序法:

  • 時間複雜度:O(n^2)
  • 空間複雜度:O(1)
  • 穩定性:穩定
    冒泡排序法的核心思想是將大的數據看作大的氣泡,小的數據看作小的氣泡,大的氣泡降下去,小的氣泡升上來。如圖:
    冒泡第一次排序

如圖,對數組中元素進行第一次排序,使1浮上來,將8沉了下去。
代碼示例:

    public static void main(String[] args) {
        int[] array={2,5,8,3,1,6,7,4,9};
        for (int i = 0; i <array.length-1 ; i++) {
            for (int j = 0; j <array.length-1-i ; j++) {
                if(array[j]>array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }
}

(二)直接插入排序

  • 越有序越快
  • 時間複雜度:
    無序:o(n^2)
    有序:o(n)
  • 空間複雜度:o(1)
  • 穩定性:穩定 直接插入排序沒有出現跳躍式的交換
    直接插入排序核心思想是將第i個數字上拿出來給tmp,將j(i-1)上的數字與tmp比較,滿足(array[j]>tmp)時將array[j]上的數字賦給array[j+1] 然後j-1,再次判斷(array[j]>tmp),如果滿足,則將array[j]上的數字賦給array[j+1],否則將tmp的值賦給array[j+1] ,如此i++,判斷所有數字;如圖:
public static void insertSort(int[] array){
    int tmp;
    for (int i = 1; i <array.length ; i++) {
        tmp=array[i];
        int j=0;
        for ( j = i-1; j >=0 ; j--) {
            if(array[j]>tmp){
                array[j+1]=array[j];
            }else{
                break;
            }
        }
        array[j+1]=tmp;
    }
}

(三)選擇排序

  • 時間複雜度:o(n^2)
  • 空間複雜度:o(1)
  • 穩定性:不穩定

選擇排序與冒泡排序比較相似,所以在我們不熟悉冒泡排序的時候容易將冒泡排序寫成選擇排序,選擇排序的基本思想如圖:

選擇排序

代碼示例:

public static void selectSort(int[] array){
    int tmp=0;
    for (int i = 0; i <array.length ; i++) {
        for (int j = i+1; j <array.length ; j++) {
            if(array[i]>array[j]){
                tmp=array[j];
                array[j]=array[i];
                array[i]=tmp;
            }
        }
    }
    System.out.println(Arrays.toString(array));
}

(四)shell排序

  • 時間複雜度:O(n^1.3 – ^1.5)
  • 空間複雜度:O(1)
  • 穩定性:不穩定

特點:

  • 快速
  • 增量序列: 總爲質數 即除了它本身和1沒有其他因子
    shell排序的思想是先分組,進行組內插入排序。如圖:
    shell排序

代碼示例:

public class shellSort {
    public static void shell(int[] array, int gap) {
        int tmp = 0;
        for (int i = gap; i < array.length; i++) {
            tmp = array[i];
            int j = 0;
            for (j = i - gap; j >= 0; j -= gap) {
                if (array[j] > tmp) {
                    array[j + gap] = array[j];
                } else {
                    break;
                }
            }
            array[j + gap] = tmp;
        }
    }

    public static void shellSort(int[] array) {
        int drr[] = {5, 3, 1};  //增量序列
        for (int i = 0; i < drr.length; i++) {
            shell(array, drr[i]);
        }
    }

    public static void main(String[] args) {
        int[] array = {12, 7, 2, 8, 15, 67, 94, 34, 16, 13, 31, 27, 65, 82, 21};
        shellSort(array);
        System.out.println(Arrays.toString(array));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章