插入排序
插入排序非常類似于整撲克牌。在開始摸牌時,左手是空的,牌面朝下放在桌上。接著,一次從桌上摸起一張牌,并將它插入到左手一把牌中的正確位置上。為了找到這張牌的正確位置,要將它與手中已有的牌從右到左地進行比較。無論什么時候,左手中的牌都是排好序的。
??如果輸入數組已經是排好序的話,插入排序出現最佳情況,其運行時間是輸入規模的一個線性函數。如果輸入數組是逆序排列的,將出現最壞情況。平均情況與最壞情況一樣,其時間代價是Θ(n2)。??也許你沒有意識到,但其實你的思考過程是這樣的:現在抓到一張7,把它和手里的牌從右到左依次比較,7比10小,應該再往左插,7比5大,好,就插這里。為什么比較了10和5就可以確定7的位置?為什么不用再比較左邊的4和2呢?因為這里有一個重要的前提:手里的牌已經是排好序的?,F在我插了7之后,手里的牌仍然是排好序的,下次再抓到的牌還可以用這個方法插入。編程對一個數組進行插入排序也是同樣道理,但和插入撲克牌有一點不同,不可能在兩個相鄰的存儲單元之間再插入一個單元,因此要將插入點之后的數據依次往后移動一個單元。
插入排序類似于整理撲克牌,從無序列中選擇一個值插入到有序列中
冒泡排序
*** 冒泡排序法的基本思想:(以升序為例)含有n個元素的數組原則上要進行n-1次排序。對于每一躺的排序,從第一個數開始,依次比較前一個數與后一個數的大小。如果前一個數比后一個數大,則進行交換。這樣一輪過后,最大的數將會出現稱為最末位的數組元素。第二輪則去掉最后一個數,對前n-1個數再按照上面的步驟找出最大數,該數將稱為倒數第二的數組元素......n-1輪過后,就完成了排序。***
快速排序
*** 快速排序是冒泡排序的一種改進,快速排序以一個基準值,將無序列分成兩部分(左邊小于基準值,右邊大于基準值),然后遞歸。***
快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被采用,再加上快速排序思想----分治法也確實實用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程序方面的考試如軟考,考研中也常常出現快速排序的身影。
選擇排序
選擇排序:比如在一個長度為N的無序數組中,在第一趟遍歷N個數據,找出其中最小的數值與第一個元素交換,第二趟遍歷剩下的N-1個數據,找出其中最小的數值與第二個元素交換......第N-1趟遍歷剩下的2個數據,找出其中最小的數值與第N-1個元素交換,至此選擇排序完成。
選擇排序是根據找到無序數列中的最大或最小值插入到有序序列尾部來排序
地精排序
雖然沒寫過這個排序,但是個人感覺這個排序很有意思也很快速
號稱最簡單的排序算法,只有一層循環,默認情況下前進冒泡,一旦遇到冒泡的情況發生就往回冒,直到把這個數字放好為止
直接看它排序的過程,待排數組[6 2 4 1 5 9]
先設計一個標識i=0然后從頭開始判斷,什么時候(i < 6)不成立,什么時候排序結束,
所以,如何控制i的值是這個算法的關鍵
例如待排數組:
[6 2 4 1 5 9]
[0 1 2 3 4 5]
看一下具體的排序過程
[ i = 0 ]時啥也不干,先讓i自增1,達到值為1才開始真正的比較
交換前[6 2 4 1 5 9][ i = 0]
交換后[6 2 4 1 5 9][ i = 1]
[ i = 1 ]比較6和2,發生交換,只要發生交換i就減1
交換前[6 2 4 1 5 9][ i = 1]
交換后[2 6 4 1 5 9][ i = 0]
[ i = 0 ]又成0了,啥也不干,自增變成1再說
交換前[2 6 4 1 5 9][ i = 0]
交換后[2 6 4 1 5 9][ i = 1]
[ i = 1 ]再比較2和6,不交換,只要不要換就自增1
交換前[2 6 4 1 5 9][ i = 1]
交換后[2 6 4 1 5 9][ i = 2]
[ i = 2 ]比較6和4,發生交換,只要交換就減1
交換前[2 6 4 1 5 9][ i = 2]
交換后[2 4 6 1 5 9][ i = 1]
[ i = 1 ]比較2和4,不交換,只要不交換就自增1
交換前[2 4 6 1 5 9][ i = 1]
交換后[2 4 6 1 5 9][ i = 2]
[ i = 2 ]比較4和6,不交換,只要不交換就自增1
交換前[2 4 6 1 5 9][ i = 2]
交換后[2 4 6 1 5 9][ i = 3]
[ i = 3 ]比較6和1,交換,只要交換就減1
交換前[2 4 6 1 5 9][ i = 3]
交換后[2 4 1 6 5 9][ i = 2]
[ i = 2 ]比較4和1,交換,只要交換就減1
交換前[2 4 1 6 5 9][ i = 2]
交換后[2 1 4 6 5 9][ i = 1]
[ i = 1 ]比較2和1,交換,只要交換就減1
交換前[2 1 4 6 5 9][ i = 1]
交換后[1 2 4 6 5 9][ i = 0]
[ i = 0 ]時啥也不干,先讓i自增1,達到值為1才開始真正的比較
交換前[1 2 4 6 5 9][ i = 0]
交換后[1 2 4 6 5 9][ i = 1]
[ i = 1]比較1和2,不交換,只要不交換就自增1
[ i = 2]比較2和4,不交換,只要不交換就自增1
[ i = 3]比較4和6,不交換,只要不交換就自增1
[ i = 4]比較6和5,交換,只要交換就減1
交換前[1 2 4 6 5 9][ i = 4]
交換后[1 2 4 5 6 9][ i = 3]
[ i = 3]比較4和5,不交換,只要不交換就自增1
[ i = 4]比較5和6,不交換,只要不交換就自增1
[ i = 5]比較6和9,不交換,只要不交換就自增1
[ i = 6]表達式(i < n)不成立,排序結束,
順序輸出結果即可:[ 1 2 4 5 6 9]
***************************************************************
static void gnome_sort(int[] unsorted)
{
int i = 0;
while (i < unsorted.Length)
{
if (i == 0 || unsorted[i - 1] <= unsorted[i])
{
i++;
}
else
{
int tmp = unsorted[i];
unsorted[i] = unsorted[i - 1];
unsorted[i - 1] = tmp;
i--;
}
}
}
兩個經典文章
1 [排序算法]:http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
2[排序動畫]:https://www.toptal.com/developers/sorting-algorithms/