1. 程式人生 > 其它 >演算法學習之路(排序)

演算法學習之路(排序)

1.選擇排序

時間複雜度為O(N^2),額外空間複雜度為O(1)

程式碼實現(java):

 1 public static void SelectionSort(int[] arr){
 2     if(arr == null || arr.length < 2){
 3         return;
 4     }
 5     for(int i = 0;i < arr.length-1;i++){
 6         int minIndex=i;
 7         for(int j=i+1;j < arr.length;j++){
 8             minIndex = arr[j]>arr[minIndex]?j:minIndex;
9 } 10 swap(arr,i,minIndex); 11 } 12 } 13 public static void swap(int[] arr,int i,int j){ 14 int tmp = arr[i]; 15 arr[i] = arr[j]; 16 arr[j] =tmp; 17 }

註解:

在程式碼的最開始我們就要把特殊情況考慮清楚,選擇排序只有一種特殊情況就是當陣列的元素個數為0或者1時,整個陣列本身就是一個有序的陣列,我們是不需要對陣列進行排序操作的;

選擇排序是我們假定第一個位置的值就是最小值,然後我們從陣列的第一個位置的值依次的與後面的元素進行比較,每次比較之後將兩者中較小的值的位置賦給一個變數minindex,當我們從第一個位置一直比較到最後一個位置之後我們就已經選擇出了整個陣列中最小的那個值的位置,我們再將這個最小值的位置與第一個位置進行交換,之後我們在從第二個位置開始執行上述操作,直至整個陣列排序完成,我們這樣操作就會得到一個升序的陣列。

2.氣泡排序

時間複雜度為O(N^2)

程式碼實現(Java)

 1 public static void Bubblesort(int[] arr){
 2     if(arr == null || arr.length<2){
 3         return;
 4     }
 5     for(int e = arr.length-1;e > 0;e--){
 6         for(int i = 0;i < e;i++){
 7             if(arr[i] > arr[i+1])
 8                 swap(arr,i,i+1);
9 } 10 } 11 } 12 public static void swap(int[] arr,int i,int j){ 13 arr[i]=arr[i]^arr[j]; 14 arr[j]=arr[i]^arr[j]; 15 arr[i]=arr[i]^arr[j]; 16 }

註解:

同樣也是一個數組我們把每個元素的位置進行編號0,1,2,3,4,5,6,7······,氣泡排序就是第0個位置與第1個位置比較誰大誰往右移動,當從第0個位置到最後一個位置全部移動完畢,最後一個位置的元素就確定下來了,它就是整個陣列中最大的那個數,因為一共有arr.length個元素,所以要進行arr.length-1次迴圈,所以第一個for迴圈規定交換操作的起始位置和結束位置,第二個for迴圈是用來依次交換相鄰兩個數的位置將大的置於右端。