我手寫排序演算法,面試官驚了,測試派詳解
一、氣泡排序 Bubble Sort
1.1、原理
1. 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個。 2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對,一輪過後最後的元素就是最大的數。 3. 針對所有的元素重複以上的步驟,除了最後一個,直到沒有任何一對數字需要比較。
1.2、時間複雜度
O(n^2)
1.3、原理圖
728 x 215 1414 x 418
1.4、程式碼實現
public static void bubbleSort(int []arr) { for(int i =1;i<arr.length;i++) { for(int j=0;j<arr.length-i;j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
二、快速排序 Quick Sort
2.1、原理
通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小, 然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
2.2、時間複雜度
O(nlogn)
2.3、原理圖一
728 x 381 1480 x 775
2.3、程式碼實現一
public static int[] sort(int[] arr,int start,int end) { int i = start; int j = end; int val = arr[start]; while(i<j) { while(arr[i]<val && i<j) { i++; } while(arr[j]>val && i<j) { j--; } if(arr[i] == arr[j] && i<j) { //這裡既可以是i++也可以是j--,但不能同時存在 //i++表示等於的值放左邊,j--表示等於的值放右邊 //不能同時存在的意思就是,相等的值只能放在一邊 i++; }else { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } if(j+1 < end) { sort(arr, j+1, end); } if(i-1 > start) { sort(arr, start, i-1); } return arr; }
2.4、原理圖二
728 x 445 1268 x 775
2.5、程式碼實現二
public static int[] sort2(int[] arr,int start,int end) { int i = start; int j = end; //挖好第一個坑,arr[start],填入小的數 int val = arr[start]; while(i<j) { //因為第一個坑是尋找小的數,所以從後開始找 while(arr[j] > val && i<j) { j--; } if(i < j) { //找到小的數arr[j],把arr[j]填入i中,j成為下一個坑。 arr[i] = arr[j]; //i坑已填,找下一個 i++; } //j坑需要入大的數,所以從前開始找 while(arr[i]<val && i<j) { i++; } if(i<j) { //找到大的數arr[i],把arr[i]填入j中,i成為下一個坑。 arr[j] = arr[i]; //j坑已填,找下一個 j--; } } //迴圈結束之後j==i,i所在的位置就是最後一個坑,把arr[start]填入。 //至此i的左邊都小於arr[start],右邊都大於arr[start] arr[i] = val; if(j+1 < end) { sort2(arr, j+1, end); } if(i-1 > start) { sort2(arr, start, i-1); } return arr; }
作者:luojie
連結:http://testingpai.com/article/1595507289441
來源:測試派