1. 程式人生 > 其它 >java中常見排序演算法

java中常見排序演算法

1 氣泡排序

排序思路:兩兩交換,大的放後面,小的放前面

程式碼實現

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

 

2 選擇排序

排序思路:每次迴圈找出最大值(最小)放在陣列末尾。

程式碼實現

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

 

3 插入排序

排序思路:將一個元素插入到已有序的陣列中,在初始時未知是否存在有序的資料,因此將元素第一個元素看成是有序的。與有序的陣列進行比較,比它大則直接放入,比它小則移動陣列元素的位置,找到個合適的位置插入。當只有一個數時,則不需要插入了,因此需要n-1趟排序

程式碼實現:

public static void insertSort(int[] arr) {
//臨時變數
int temp;
//外層迴圈控制需要排序的趟數(從1開始因為將第0位看成了有序資料)
for (int i = 1; i < arr.length; i++) {
temp = arr[i];
//如果前一位(已排序的資料)比當前資料要大,那麼就進入迴圈比較[參考第二趟排序]
int j = i - 1;
while (j >= 0 && arr[j] > temp) {
//往後退一個位置,讓當前資料與之前前位進行比較
arr[j + 1] = arr[j];
//不斷往前,直到退出迴圈
j--;
}
//退出了迴圈說明找到了合適的位置了,將當前資料插入合適的位置中
arr[j + 1] = temp;
}
System.out.println(Arrays.toString(arr));
}

  

4 快速排序

排序思路:在陣列中找一個元素(節點),比它小的放在節點的左邊,比它大的放在節點右邊。一趟下來,比節點小的在左邊,比節點大的在右邊。不斷執行這個操作….

程式碼實現:

/**
     * 快速排序
     * @param arr
     * @param L   指向陣列第一個元素
     * @param R   指向陣列最後一個元素
     */
    public static void quickSort(int[] arr, int L, int R) {
        int i = L;
        int j = R;
        //支點
        int pivot = arr[(L + R) / 2];
        //左右兩端進行掃描,只要兩端還沒有交替,就一直掃描
        while (i <= j) {
            //尋找直到比支點大的數
            while (pivot > arr[i])
                i++;
            //尋找直到比支點小的數
            while (pivot < arr[j])
                j--;
            //此時已經分別找到了比支點小的數(右邊)、比支點大的數(左邊),它們進行交換
            if (i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
        }
        //上面一個while保證了第一趟排序支點的左邊比支點小,支點的右邊比支點大了。
        //“左邊”再做排序,直到左邊剩下一個數(遞迴出口)
        if (L < j){
            quickSort(arr, L, j);
        }
        //“右邊”再做排序,直到右邊剩下一個數(遞迴出口)
        if (i < R){
            quickSort(arr, i, R);
        }
        System.out.println(Arrays.toString(arr));
    }