1. 程式人生 > >冒泡排序和選擇排序的源碼和兩者之間的復雜度簡介

冒泡排序和選擇排序的源碼和兩者之間的復雜度簡介

循環 第一次 交換 排序 算法 AS pre 排序算法 n!

冒泡排序

冒泡排序算法原理
* 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交換操作。從這個意義上講,交換排序的性能略優於冒泡排序。
而且,交換排序比冒泡排序的思想更加直觀。

冒泡排序和選擇排序的源碼和兩者之間的復雜度簡介