沒有什麼能夠阻擋,我對自由的嚮往!
阿新 • • 發佈:2018-12-17
基礎排序
一、說明
演算法開篇,今後將會不定期更新。 演算法最基礎的就是排序,而排序中最基礎的要屬冒泡、插入和選擇排序了,由於它們的時間複雜度都是 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;
}
}