Java常用排序算法

排序算法冒泡排序選擇排序插入排序、堆排序、歸併排序、計數排序、基數排序、桶排序、快速排序

-冒泡排序
基本思想
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,
讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

在這裏插入圖片描述
代碼實現

    /**
     * 冒泡排序
     * 基本思想:
     * 在要排序的一組數中,對當前還未排好序的範圍內的全部數,
     * 自上而下對相鄰的兩個數依次進行比較和調整,
     * 讓較大的數往下沉,較小的往上冒。
     * 即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
     * <p>
     * 第一輪:找到了最大值
     * 第二輪:找到次最大值
     * 有n個數據,比(n-1)次比完
     * for循環嵌套 :外循環控制行,內循環控制列
     * a[j] > a[j + 1] :從小到大
     * a[j] < a[j + 1]:從大到小
     */
    public void bubbleSort() {
        int a[] = {49, 2, -16, 5, 7, 23, 45, 67, 76, 78, 35, 55, 54, 59, 36, 43, 82, 88, 41, 60, 70, 80};
        int temp = 0;
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = 0; j < a.length - 1 - i; j++) {//j < a.length - 1 也可以,不過多比較了,影響性能
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        //遍歷數組
        for (int arr : a) {
            Log.e("TAG", "冒泡排序:" + arr);
        }
    }
  • 選擇排序
    基本思想
    在要排序的一組數中,選出最小的一個數與第一個位置的數交換
    然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。
    缺點:在每趟比較過程中,一旦發現某個元素比第1位的元素小,就交換它們,但這是沒必要的,徒增了交換的次數。
    優化:選擇排序的核心是,在每趟比較中,找到本趟中最小的元素放在本趟比較的第1個位置,所以選擇排序的每趟比較只需要交換一次即可,只要找到本趟比較中最小的元素和本趟比較中第1位置的元素交換即可
    在這裏插入圖片描述
    文字描述:
    第1趟比較:拿第1個元素依次和它後面的每個元素進行比較,如果第1個元素大於後面某個元素,交換它們,經過第1趟比較,數組中最小的元素被選出,它被排在第一位
    第2趟比較:拿第2個元素依次和它後面的每個元素進行比較,如果第2個元素大於後面某個元素,交換它們,經過第2趟比較,數組中第2小的元素被選出,它被排在第二位

    第n-1趟比較:第n-1個元素和第n個元素作比較,如果第n-1個元素大於第n個元素,交換它們

代碼實現

    /**
     * 選擇排序:
     * 在要排序的一組數中,選出最小的一個數與第一個位置的數交換;
     * 然後在剩下的數當中再找最小的與第二個位置的數交換,
     * 如此循環到倒數第二個數和最後一個數比較爲止。
     * <p>
     * 文字敘述過程:
     * 第1趟比較:拿第1個元素依次和它後面的每個元素進行比較,
     * 如果第1個元素大於後面某個元素,交換它們,經過第1趟比較,
     * 數組中最小的元素被選出,它被排在第一位
     * 第2趟比較:拿第2個元素依次和它後面的每個元素進行比較,
     * 如果第2個元素大於後面某個元素,交換它們,經過第2趟比較,
     * 數組中第2小的元素被選出,它被排在第二位
     * ......
     * 第n-1趟比較:第n-1個元素和第n個元素作比較,如果第n-1個元素大於第n個元素,交換它們
     */
    public void selecrSort() {
        int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
        for (int i = 0; i < num.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < num.length; j++) {
                if (num[i] > num[j]) {
                    minIndex = num[j] < num[minIndex] ? j : minIndex;
                    //                    int temp = num[j];
                    //                    num[j] = num[i];
                    //                    num[i] = temp;
                }
            }
            int temp = num[i];
            num[i] = num[minIndex];
            num[minIndex] = temp;
        }

        //遍歷數組
        for (int arr : num) {
            Log.e("TAG", "選擇排序:" + arr);
        }
    }

插入排序
基本思想
在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,
使得這n個數也是排好順序的。如此反覆循環,直到全部排好順序。
在這裏插入圖片描述
最好的情況下,即待排序序列按關鍵字已經有序排列,每趟操作只需1次或者0次移動
在最壞的情況下,即待排序序列按關鍵字逆排序序列,這時在第j趟操作中,爲插入元素需要同前面的j個元素進行j次關鍵字比較,移動元素的次數爲j+1次。此時有:總比較次數=n(n-1)/2次,總移動次數 = (n+2)(n-1)/2次
平均情況下:即在第j趟操作中,插入記錄大約需要時間同前面的j/2個元素進行關鍵字比較,移動記錄次數j/2+1次

代碼實現

   /**
     * 插入排序:
     * 給你一個無序的數組,或者一段需要排序的序列,
     * 我們通常用第一個元素作爲參考值,
     * 從第二個元素開始和這個參考值進行比較,
     * 比這個參考值大的時候放在這個參考值的後面,
     * 比這個參考值小的時候在和這個參考值的前一位進行比較,
     * 當比較至適當位置進行插入
     */
    public void insertSort() {
        int num[] = {34, -17, 3, 30, 98, 4, 66, 55, 77, 60, 88};
        int temp;
        //將第一個值看做一個有序序列
        for (int i = 1; i < num.length; i++) {
            temp = num[i];
            //如果前一位(已排序的數據)比當前數據要大,那麼就進入循環比較[參考第二趟排序]
            while (i >= 1 && num[i - 1] > temp) {
                //往後退一個位置,讓當前數據與之前前位進行比較
                num[i] = num[i - 1];
                //不斷往前,直到退出循環
                i--;
            }
            //退出了循環說明找到了合適的位置了,將當前數據插入合適的位置中
            num[i] = temp;
        }
        //遍歷數組
        for (int arr : num) {
            Log.e("TAG", "插入排序:" + arr);
        }
    }

更多關於冒泡排序,選擇排序、插入排序的
冒泡排序:
https://blog.csdn.net/qq_41679818/article/details/90296399
https://blog.csdn.net/NathanniuBee/article/details/83413879
選擇排序:
https://blog.csdn.net/u011109881/article/details/80038573
插入排序:
https://blog.csdn.net/weixin_43956598/article/details/90181567
https://blog.csdn.net/qq_28081081/article/details/80594386

發佈了17 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章