1. 程式人生 > 實用技巧 >冒泡、快速、選擇、插入演算法

冒泡、快速、選擇、插入演算法

冒泡

    public void sortedList1(int[] arr) {
        int tmp;
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] 
= tmp; } } } }

快速

    /**
     * @param arr   排列的陣列
     * @param left  當前排列陣列片段的最左下標
     * @param right 當前排列陣列片段的最右下標
     * @param tmp   預設右邊下標先判斷,則tmp取最左下標值arr[left]
     */
    public void sortedList2(int[] arr, int left, int right, int tmp) {
        int
start = left; //記錄當前需要排序陣列片段起點下標 int end = right; //記錄當前需要排序陣列片段終止下標 int pos = 1; //1:當前由right指標判斷(預設), 0:當前由left指標判斷 while (left != right) { if (pos == 1) { if (arr[right] < tmp) { arr[left] = arr[right]; //陣列左端下標賦值 left++; //
左下標往左移一位 pos = 0; //切換為left指標判斷 } else { //右下標繼續移動 right--; } } else { if (arr[left] > tmp) { arr[right] = arr[left]; //陣列右端下標賦值 right--; //右下標往右移一位 pos = 1; //切換為right指標判斷 } else { //左下標繼續移動 left++; } } } // 跳出迴圈,此時left、right指向同一下標,left = right,取哪個都行 arr[left] = tmp; //已經定位tmp值的位置,即下標為left(right) // 以left(right)下標作為分割點,進行下面的判斷 if (left - start > 1) { // 左邊陣列片段長度大於1,繼續快排 sortedList2(arr, start, left - 1, arr[start]); } if (end - left > 1) { // 右邊陣列片段長度大於1,繼續快排 sortedList2(arr, left + 1, end, arr[left + 1]); } }

思路

https://blog.csdn.net/qq_40595682/article/details/102146917

選擇

    // 選擇排序,改進了冒泡,減少了交換的次數
    public void sortedList3(int[] arr) {
        int minIdx; //記錄最小值下標
        int tmp; //交換暫存變數
        for (int i = 0; i < arr.length; i++) {
            minIdx = i; // 預設取到的第一個為最小值
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIdx]) {
                    minIdx = j; //重新記錄最小值下標
                }
            }
            if (minIdx != i) {
                //最小值不是第一個,則交換
                tmp = arr[i];
                arr[i] = arr[minIdx];
                arr[minIdx] = tmp;
            }
        }
    }

插入

    public void sortedList4(int[] arr) {
        int tmp;
        for (int i = 1; i < arr.length; i++) {
            tmp = arr[i]; //需要插入的值
            for (int k = i; k > 0; k--) {
                if(arr[k-1] > tmp){
                    arr[k] = arr[k-1]; //向後移動一位
                    if (k==1) //此時tmp是最小值,已經移動到了arr[1],且此時arr[0]=arr[1]
                        arr[k-1] = tmp;  // arr[0]賦值

                }else if (arr[k-1] < tmp){
                    if (k != i) //如果k == i 此時的tmp剛好比前面的值都大,無需移動,直接跳出迴圈
                        arr[k] = tmp;
                    break;
                }
            }
        }
    }

思路