Java資料結構與演算法(二)--簡單排序
阿新 • • 發佈:2020-08-23
目錄
為了對大量的資料進行檢索,需要對資料進行排序,就像上章講的,二分查詢要快於迭代查詢。
由於排序非常耗時且十分重要,它已經成為計算機中相當重要的課題。
這章將要講三個時間複雜度都為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)的演算法