冒泡排序和選擇排序的源碼和兩者之間的復雜度簡介
冒泡排序
冒泡排序算法原理
* 1 比較相鄰的元素,如果前一個比後一個大,就把它們兩個調換位置。
* 2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
* 3針對所有的元素重復以上的步驟,除了最後一個。
* 4持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
實例:
例子: 4 3 8 5 (按遞增排)
* 第1輪: 3 4 8 5 3 4 8 5 3 4 5 8
* 第2輪: 3 4 5 8 3 4 5 8
* 第3輪: 3 4 5 8
實現代碼:
public void maoPaoSort(int arr[]){ for(int i=1;i<arr.length;i++){//外 、 //層循環定義循環輪數 //內層循環 定義比較次數 for(int j=0;j<arr.length-i;j++){ //如果條件改成arr[j] >= arr[j+1],則變為不穩定的排序算法 if(arr[j]>arr[j+1]){ int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } } }
時間復雜度分析:
*其外層循環執行 N-1次。
* 內層循環最多的時候執行N次,最少的時候執行1次,平均執行 (N+1)/2次。
* 所以循環體內的比較交換約執行 (N-1)(N+1)/2 = (N^2-1)/2
* 按照計算復雜度的原則,去掉常數,去掉最高項系數,其復雜度為O(N^2)。
選擇排序算法:
原理:
*1 首先在未排序的序列裏找到最小(大)元素,放到序列的首端,
*2 再從剩余元素中找到最小(大)的元素,放到序列的尾端。
*3 依次循環,直到排序完成。
實例:
*例子: 5, 4, 8, 9, 2, 1
*第1輪 1, 4, 8, 9, 2, 5(1 5交換)
*第2輪 1, 2, 8, 9, 4, 5(2 4交換)
*第3輪 1, 2, 4, 9, 8, 5 (4 8交換)
*第4輪 1, 2, 4, 5, 8, 9 (5 9交換)
代碼實現:
public void xuanZeSort(int []arr){ int min,temp; for(int i=0;i<arr.length-1;i++){ min=i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[i]){ min=j; } } if(min!=i){ temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; } } }
時間復雜度分析:
選擇排序的復雜度分析。第一次內循環比較N - 1次,然後是N-2次,N-3次,……,最後一次內循環比較1次。
共比較的次數是 (N - 1) + (N - 2) + ... + 1
(N - 1 + 1)* N / 2 = N^2 / 2
。舍去最高項系數,其時間復雜度為
O(N^2)
。
選擇排序和冒泡排序的效率問題。
雖然選擇排序和冒泡排序的時間復雜度一樣,但實際上,選擇排序進行的交換操作很少,最多會發生 N - 1次交換。
而冒泡排序最壞的情況下要發生N^2 /2
交換操作。從這個意義上講,交換排序的性能略優於冒泡排序。
而且,交換排序比冒泡排序的思想更加直觀。
冒泡排序和選擇排序的源碼和兩者之間的復雜度簡介