1. 程式人生 > >[演算法天天見](一)基礎排序

[演算法天天見](一)基礎排序

基礎排序

一、說明

演算法開篇,今後將會不定期更新。
演算法最基礎的就是排序,而排序中最基礎的要屬冒泡、插入和選擇排序了,由於它們的時間複雜度都是 O(n²),所以在實際應用中幾乎不會使用它們,而是採用更快的排序方法。不過在不少面試過程中,還是會遇到要求寫出這種的情況,所以我們也是必須熟練掌握這些排序演算法的思路。

二、演算法

氣泡排序

/**
		 * 氣泡排序是相鄰的兩個資料兩兩交換,直到有序
		 * [6,8,5,1] -> [6,5,1,8] ->[5,1,6,8]->[1,5,6,8]
		 * 至少要迴圈 陣列的長度-1 次才能滿足最後得到的陣列有序
		 * 
		 * 它是原地排序 所以空間複雜度是1
		 * 時間複雜度為 O(n²)
		 * @param source
		 * 
		 */
public function BubbleSort(source:Array):void { if(!source || source.length <= 1) return; var i:int = 0, j:int = 0; for( i = 0; i < source.length; i++) { for(j = 0; j < source.length - i - 1; j++)//每一次排序過後最後一個都是有序的所以沒必要再去判斷順序了 { if(source[j] > source[j + 1]) {
var temp:int = source[j]; source[j] = source[j + 1]; source[j + 1] = temp; } } } }

插入排序

/**
		 * 
		 * 插入排序
		 * 就像玩家打撲克接牌一樣, 每次接到的牌與玩家手中的牌做對比
		 * 找到要插入的位置,移動之後的牌挪出這個位置然後再執行插入
		 * 
		 * [10,5,8,6,3] -> [5,10,8,6,3] -> [5,8,10,6,3] -> [5,6,8,10,3] -> [3,5,6,8,10]
		 * 
		 * 它是原地排序 所以空間複雜度是1
		 * 時間複雜度為 O(n²)
		 * @param source
		 * 
		 */
public function InsertionSort(source:Array):void { if(!source || source.length <= 1) return; var i:int = 0, j:int = 0; var value:int; for(i = 1; i < source.length; i++) { value = source[i]; for(j = i - 1; j >= 0; j--)//這裡用 -- 是為了方便移動, 如果採用++需要做很多額外操作 { if(source[j] > value) { source[j + 1] = source[j];//移動位置 }else { break; } } source[j + 1] = value; } }

選擇排序

/**
		 * 選擇排序
		 * 選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾
		 * [5,4,3,2,1] -> [1,4,3,2,5] -> [1,2,3,4,5]
		 * 
		 * 
		 * 它是原地排序 所以空間複雜度是1
		 * 時間複雜度為 O(n²)
		 * @param source
		 * 
		 */		
		public function SelectionSort(source:Array):void
		{
			if(!source || source.length <= 1) return;
			var i:int = 0, j:int = 0;
			var mini:int;
			for(i = 0; i < source.length - 1; i++) //只需要遍歷九次
			{
				mini = i;
				//找到未排序陣列中的最小值
				for( j = i; j < source.length; j++)
				{
					if(source[j] < source[mini])
					{
						mini = j;
					}
				}
				//交換
				var temp:int = source[i];
				source[i] = source[mini];
				source[mini] = temp;
			}
		}