《怪物獵人崛起》2.0版控制流狩獵笛配裝推薦
一 、簡單排序
1、氣泡排序
public static void main(String[] args) { int [] arr = new int[]{3,2,4,9,1}; for(int i = 0;i < arr.length;i++){ for(int k = 0;k < arr.length-i-1;k++){ if(arr[k] > arr[k+1]){ int temp = arr[k]; arr[k] = arr[k+1]; arr[k+1] = temp; } } } for(int i = 0;i < arr.length;i++){ System.out.print(" " + arr[i]); } }
規則:
(1)比較2個數據
(2)如果左邊的值大於右邊的值,則交換位置,如果左邊的值小與右邊的值,則不動
(3)向右依次比較,直到最右邊,此時最右邊的值是陣列中最大值(這也是被稱為冒泡的原因),
(4)重新回到最左邊進行第二次排序,從左到右依次比較大小,注意因為最右邊的資料已經排好,所以這次排序只比較到,N-2的位置。N為數值的個數
。。。。。以此類推
無論何時,只要看到一個迴圈巢狀在另一個迴圈裡這個演算法的執行時間就是O(N^2)級別
冒泡演算法(N*(N-1)/2),10個數據比較45次,進行45次交換。
2、選擇排序
public static void main(String[] args) { int [] arr = new int[]{3,2,4,9,1}; int sign; for(int i = 0;i < arr.length-1;i++){ sign = i; for(int k = i+1;k < arr.length;k++){ if(arr[k] < arr[sign]){ sign = k; } } int temp = arr[i]; arr[i] = arr[sign]; arr[sign] = temp; } for(int i = 0;i < arr.length;i++){ System.out.print(" " + arr[i]); } }
規則:
(1)首先將所有資料掃描一遍,找出最小的值並和最左邊的值交換,即0下標位置
(2)再次掃描時從1下標開始,因為首次掃描時最左邊資料0下標已經是最小值了
注意:sign = i,如果當前arr[k]<arr[i]為false的話,陣列是保持不變的
選擇排序是氣泡排序的改進版,將必要的交換次數從O(N^2)減少到O(N),但比較次數並沒有減少,仍為N*(N-1)/2,10個數據比較45次,但只進行10次交換。
選擇演算法(N*(N-1)/2),10個數據比較45次,但只進行10次交換。
3、插入排序
public static void main(String[] args) { int [] arr = new int[]{1,2,3,9,4,5,6}; int in,out; for(out = 1;out < arr.length;out++){ int temp = arr[out]; in = out; while(in > 0 && arr[in-1] >= temp){ arr[in] = arr[in-1]; --in; } arr[in] = temp; } for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } }
規則:
(1)記錄標記的數值temp
(2)用標記數值與標記左側資料依次比較,比較值大於標記值,則比較值右移一位
(3)在每趟結束時,在將temp插入後,比out變數下標號小的資料項都是有序的
插入排序的效率
在第一趟排序中,它最多比較一次,第二趟兩次,依此類推。
1+2+3+......+N-1=N(N-1)/2
因為每趟排序在發現插入點之前,平均只有全體資料的一半真的進行了比較。所以除以2
N(N-1)/4
複製的次數大致等於比較的次數。然而,一次複製與一次交換耗費的時間是不同的,所以相對於隨機資料,這個演算法比冒泡快一倍,比選擇排序略快
對於隨機順序的資料進行插入排序也需要O(N^2)時間級
轉載於:https://my.oschina.net/kdy1994/blog/888305