常見的各種排序算法匯總


 

 

 排序,有內排序和外排序

內排序,是在內存中進行

外排序,是在磁盤上進行

 

內排序根據是否使用比較大小的方法,又分比較排序和非比較排序

 

首先,Java中自已是有排序的

說明:
(1)Arrays類中的sort()使用的是“經過調優的快速排序法”;
(2)比如int[],double[],char[]等基數據類型的數組,Arrays類之只是提供了默認的升序排列,沒有提供相應的降序排列方法。
(3)要對基礎類型的數組進行降序排序,需要將這些數組轉化為對應的封裝類數組,如Integer[],Double[],Character[]等,對這些類數組進行排序。(其實還不如先進行升序排序,自己在轉為將序)。

import java.util.Arrays;

public class TestSort {

    int a[] = {1, 2, 3, 4, 5, 6, 7};
    int temp;

    @Test(priority = 1, description = "利用Arrays中的Sort函數排序")
    public void ArraysSort() {
        Arrays.sort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

}

  

 

 

Step01:冒泡排序

原理:比較兩個相鄰的元素,將值大的元素交換至一端。

思路:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。
即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。
然后比較第2個數和第3個數,將小數放前,大數放后,
如此繼續,直至比較最后兩個數,將小數放前,大數放后。

重復第一趟步驟,直至全部排序完成。

public class Sort01_BubbleSort {

    public static void main(String agrs[]) {

        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        System.out.println("\n"+arr.length);
        System.out.println("before sort:");
        for (int num : arr) {
            System.out.print(num + " ");
        }


        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1-i; j++) {
                if (arr[j] > arr[j + 1]) {//if 后一位的數小,將被往前移動
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
                System.out.println("\n"+"---第"+(i+1)+"輪第"+(j+1)+"次-----");
                for (int num : arr) {
                    System.out.print(num + " ");
                }

            }
        }
        System.out.println("\n"+"---");
        System.out.println("after sort:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

  查看具體執行的過程:

"C:\Program Files\Java\jdk1.8.0_161\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=55246:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\00M_IDEA_Project\mavenDemo_idea01\target\classes" Sort01_BubbleSort

10
before sort:
1 2 3 4 5 6 7 8 9 0 
---第1輪第1次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第2次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第3次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第4次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第5次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第6次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第7次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第8次-----
1 2 3 4 5 6 7 8 9 0 
---第1輪第9次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第1次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第2次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第3次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第4次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第5次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第6次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第7次-----
1 2 3 4 5 6 7 8 0 9 
---第2輪第8次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第1次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第2次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第3次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第4次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第5次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第6次-----
1 2 3 4 5 6 7 0 8 9 
---第3輪第7次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第1次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第2次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第3次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第4次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第5次-----
1 2 3 4 5 6 0 7 8 9 
---第4輪第6次-----
1 2 3 4 5 0 6 7 8 9 
---第5輪第1次-----
1 2 3 4 5 0 6 7 8 9 
---第5輪第2次-----
1 2 3 4 5 0 6 7 8 9 
---第5輪第3次-----
1 2 3 4 5 0 6 7 8 9 
---第5輪第4次-----
1 2 3 4 5 0 6 7 8 9 
---第5輪第5次-----
1 2 3 4 0 5 6 7 8 9 
---第6輪第1次-----
1 2 3 4 0 5 6 7 8 9 
---第6輪第2次-----
1 2 3 4 0 5 6 7 8 9 
---第6輪第3次-----
1 2 3 4 0 5 6 7 8 9 
---第6輪第4次-----
1 2 3 0 4 5 6 7 8 9 
---第7輪第1次-----
1 2 3 0 4 5 6 7 8 9 
---第7輪第2次-----
1 2 3 0 4 5 6 7 8 9 
---第7輪第3次-----
1 2 0 3 4 5 6 7 8 9 
---第8輪第1次-----
1 2 0 3 4 5 6 7 8 9 
---第8輪第2次-----
1 0 2 3 4 5 6 7 8 9 
---第9輪第1次-----
0 1 2 3 4 5 6 7 8 9 
---
after sort:
0 1 2 3 4 5 6 7 8 9 
Process finished with exit code 0

 

 

Step02:選擇排序

原理:每一趟從待排序的記錄中選出最小的元素,放到一端。

思路:第一次從記錄中選擇最小的數放到一端,第二次動剩下的記錄中選擇最小的,放到第二位

依次往下,直到全部排序完成。

public class Sort02_SelectionSort {

    public static void main(String[] args) {
        int[] arr = {4,13,2,1};
        System.out.println("\n" + arr.length);
        System.out.println("交換之前:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        //選擇排序
        for (int i = 0; i < arr.length - 1; i++) {
            int k = i;
            for (int j = k + 1; j < arr.length; j++) {
                if (arr[j] < arr[k]) {
                    k = j; //記下目前找到的最小值所在的位置
                }
            }
            //在內層循環結束,也就是找到本輪循環的最小的數以后,再進行交換
            if (i != k) {  //交換a[i]和a[k]
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
            System.out.println("\n"+"---第"+(i+1)+"輪找到最小數的位置是第"+(k+1)+"個數-----");
            for (int num : arr) {
                System.out.print(num + " ");
            }

        }
        System.out.println();
        System.out.println("交換后:");
        for (int num : arr) {
            System.out.print(num + " ");
        }

    }

}

  

查看具體執行過程

"C:\Program Files\Java\jdk1.8.0_161\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=57407:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\00M_IDEA_Project\mavenDemo_idea01\target\classes" Sort02_SelectionSort

4
交換之前:
4 13 2 1 
---第1輪找到最小數的位置是第4個數-----
1 13 2 4 
---第2輪找到最小數的位置是第3個數-----
1 2 13 4 
---第3輪找到最小數的位置是第4個數-----
1 2 4 13 
交換后:
1 2 4 13 
Process finished with exit code 0

 

 Step03:直接插入排序

直接插入排序是將未排序的數據插入至已排好序序列的合適位置。

思路:具體流程如下:
  1、首先比較數組的前兩個數據,並排序;
  2、比較第三個元素與前兩個排好序的數據,並將第三個元素放入適當的位置;
  3、比較第四個元素與前三個排好序的數據,並將第四個元素放入適當的位置;
   ......
  4、直至把最后一個元素放入適當的位置。
import java.util.Arrays;

public class Sort03_InsertSort {

    public static void main(String[] args) {
        int[] arr = {4, 13, 2, 1};
        System.out.println("\n" + arr.length);
        System.out.println("交換之前:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println("\n");
        int tmp;
        for (int i = 1; i < arr.length; i++) {
            // 待插入數據
            tmp = arr[i];
            int j;
            for (j = i - 1; j >= 0; j--) {
                // 判斷是否大於tmp,大於則后移一位
                if (arr[j] > tmp) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            arr[j + 1] = tmp;
            System.out.println(i + ":" + Arrays.toString(arr));
        }

    }
}

  

 
private void quickSort(int[] arr, int low, int high) {
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        //temp就是基准位
        temp = arr[low];

        while (i<j) {
            //先看右邊,依次往左遞減
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            //再看左邊,依次往右遞增
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            //如果滿足條件則交換
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }

        }
        //最后將基准為與i和j相等位置的數字交換
        arr[low] = arr[i];
        arr[i] = temp;
        //遞歸調用左半數組
        quickSort(arr, low, j-1);
        //遞歸調用右半數組
        quickSort(arr, j+1, high);
    }

 

快速排序

import java.util.Arrays;

/**
 * 快速排序的測試
 *
 */
public class TestSort {

    public int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 };

    public int[] sort2(int[] datas, int low, int high) {
        int i = low, j = high, key = datas[low], tmp;
        while (i < j) {
            while (i < j && datas[j] >= key) {
                j--;
            }
            while (i < j && datas[i] < key) {
                i++;
            }
            if (i < j) {
                tmp = datas[i];
                datas[i] = datas[j];
                datas[j] = tmp;
            }
        }
        if (i - low > 0) {
            sort2(datas, low, i);
        }
        if (high - i > 1) {
            sort2(datas, i + 1, high);
        }
        return datas;
    }

    /**
     * 測試主方法
     *
     * @param args
     */
    public static void main(String args[]) {
        TestSort q = new TestSort();
        int[] t = q.arr;
        q.sort2(t, 0, t.length - 1);
        System.out.println(Arrays.toString(t));
    }
}

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM