1. 程式人生 > 實用技巧 >Java資料結構與演算法(二)--簡單排序

Java資料結構與演算法(二)--簡單排序

目錄

為了對大量的資料進行檢索,需要對資料進行排序,就像上章講的,二分查詢要快於迭代查詢。

由於排序非常耗時且十分重要,它已經成為計算機中相當重要的課題。

這章將要講三個時間複雜度都為O(N2)的簡單排序:氣泡排序/選擇排序/插入排序

回到頂部

1.氣泡排序

氣泡排序就像水中的泡泡從水底升上來,不斷變大一樣。

每次排序將最大的資料冒上來(兩兩比較,將大的交換到後面或前面),最大的數設為已排,再去不斷排序未排序的序列

排序過程可以參考下圖:

程式碼如下:

/**
 * 氣泡排序
 
*/ public class BubbleSort { public static int[] sort(int[] arr){ int len = arr.length; int temp; for (int i = 1; i < len; i++) { boolean flag = false; for (int j = 0; j < len-i; j++) { if(arr[j]>arr[j+1]){ temp
= arr[j+1]; arr[j+1]= arr[j]; arr[j]=temp; flag = true; } } //可能存在沒到最後一輪就已經排序完的情況 //設定一個標識,當該輪沒有交換的時候表示排序結束 if(!flag)break; //看下每輪排序後的排序情況 System.out.println("第"+i+"輪排序後,排序結果:"); display(arr); }
return arr; } public static void display(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] arr = {3,4,7,5,1,2,9,6,8}; System.out.println("初始資料:"); display(arr); System.out.println("-----------------------------------------"); arr = sort(arr); System.out.println("-----------------------------------------"); System.out.println("排序完成結果:"); display(arr); } }

執行情況:

回到頂部

1.選擇排序

上個氣泡排序可以發現,每輪排序的時候都要不停的交換資料使最大的數”冒“上來。

選擇排序優化了交換次數,每次找到將待排資料的最小,將它放到最前面,即為最小數與最前面資料的交換,只需移動資料即可

排序過程參考下圖:

程式碼如下:

/**
 * 選擇排序
 */
public class ChoiceSort {

    public static int[] sort(int[] arr){
        int len = arr.length;
        int min = 0;//每輪找到的最小值
        int temp;
        for (int i = 0; i < len-1; i++) {
            //將最小值放在最前面,前面資料不斷有序
            //未排資料範圍不斷縮小
            for (int j = i+1; j < len; j++) {
                if(arr[j]<arr[min]){
                    min = j;
                }
            }

            //將找到的最小值與佇列最前面比較
            if(arr[min]<arr[i]){
                temp = arr[i];
                arr[i] =arr[min];
                arr[min]=temp;
            }

            //看下每輪排序後的排序情況
            System.out.println("第"+i+"輪排序後,排序結果:");
            display(arr);
        }
        return arr;
    }

    public static void display(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3,4,7,5,1,2,9,6,8};
        System.out.println("初始資料:");
        display(arr);
        System.out.println("-----------------------------------------");
        arr = sort(arr);
        System.out.println("-----------------------------------------");
        System.out.println("排序完成結果:");
        display(arr);
    }
}

執行情況:

回到頂部

1.插入排序

接下來將要講我覺得基本排序中最重要的插入排序,它也是快排等高階排序在資料量不大時採用的排序方式

它的思想就是,從待排序列取數,不斷插入已排資料的方式

排序過程參考下圖:

程式碼如下:

/**
 * 插入排序
 */
public class InsertSort {

    public static int[] sort(int[] arr){
        int len = arr.length;
        for (int i = 0; i < len-1; i++) {
            //第1個數據預設有序,從後面開始排序
            int j = i+1;
            //待排資料插入有序序列時,待排資料是一個不斷前移的過程
            //可以直接獲取待排序列,將有序序列後移,達到邊界條件時:j=0 或 待排資料大於等於前面的資料
            //將待排資料插入該位置
            int temp = arr[j];
            while(j>0 && temp<arr[j-1]){//未達到邊界條件,不斷後移,騰出待排資料的位置
                arr[j]=arr[--j];
            }
            arr[j]=temp;

            //看下每輪排序後的排序情況
            System.out.println("第"+(i+1)+"輪排序後,排序結果:");
            display(arr);
        }
        return arr;
    }

    public static void display(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3,4,7,5,1,2,9,6,8};
        System.out.println("初始資料:");
        display(arr);
        System.out.println("-----------------------------------------");
        arr = sort(arr);
        System.out.println("-----------------------------------------");
        System.out.println("排序完成結果:");
        display(arr);
    }
}

執行情況:

回到頂部

4.總結

雖然上述演算法的時間複雜度都為O(N2)但某些情況,某些演算法會優於某些演算法

氣泡排序最簡單但一般情況不採用

插入排序是應用到最多的排序方法

接下來我們會講到一些高階演算法,將介紹一些時間複雜度小於O(N2)的演算法