從最簡單的排序開始,前人們一直在這不斷追尋著這個看似簡單的問題的最優解。
筆者也將自己對於這些不同排序演算法的認識,見解記錄下來。
目前記錄了10種排序方法。
目錄:二,選擇類
小結:**以上是本篇內容。**
三:交換類
1.直接交換排序
2.快速排序
四:特殊範圍類
1.桶排序
2.計數排序
3.基排序
4.歸併排序
五:總結
這一類最大的特色是把資料分為兩類,
一類是已排序的區間,(以增序為例)
另一類是未排序的區間,取出未排序的區間內第乙個數字,實行插入計畫。
問題來了,陣列如何直接插入?
步驟:
1.儲存該數後,先迴圈已排序區間,找到該數的插入位置,記錄下來。
2.將插入位置之後的數(從已排序區間內最後乙個數開始)乙個乙個往後移動一位,此時就空出了插入位置。
3.將儲存的數插入。
如此往復,已排序區間越來越大,直至排好。
動畫演示
**如下:
void insertsort(int *ar, int count)
// 第二步,將從i開始到index-1的數,向後平移乙個位置。
希爾排序是基於直接插入排序上提出的,所以比直接插入快!
那麼到底好在哪?
步驟:
1.希爾排序先將資料等間距(步長)分為各小組(一般最後一組的數不全滿)
2.然後將每個組的第乙個數(形成一組新資料)進行直接插入排列,再將每個組的第二數取出進行直接插入排列,如此遍歷每個組。如何取?
(0 + 步長 *組數, 1 + 步長 * 組數。。。)
3.步長縮短,重分小組,執行第2步,直至步長為1。此時排序完成。
注:直接插入排序是步長為1的希爾排序
**:
動畫演示:
**如下:
void shellsort(int *ar, int count);
static void stepinsertsort(int *ar, const int count, const int start, const int step);
//第二步操作如下
static void stepinsertsort(int *ar, const int count, const int start, const int step)
for (j = index - step; j >= i; j -= step)
ar[i] = current; }}
void shellsort(int *ar, int count)
}}
ps:有乙個叫做雞尾酒排序,希爾排序增加版本,每次取出最大值,和最小值。什麼是選擇類?
筆者認為就是在排序範圍內,選擇每次只取出最大數(或者最小數),
同樣它也運用了已排序區間,和未排序區間,不過由於知道是 「最大數」 ,所以直接插入到已排序的的前面。
步驟:
1.遍歷陣列(未排序區間),找出最小數,記錄下標。
2.把陣列第乙個數和最小數交換,形成已排序區間。
3.在未排序區間,執行第1步,(即找到第二小的數),再執行第2步,如此繼續第3步。直至排序成功。
動畫演示:
**如下:
其實堆就是可以用來找出最大數(最小數)的。
步驟:
1.將陣列內資料依次插入完全二叉樹中,建立成乙個大根堆。
2.將大根堆進行調整,滿足如下特徵:父節點的值一定大於左右孩子(其葉子節點)的值。
3.將最後乙個葉子節點的數與最大數(最上面的根節點)互換位置,並把最大數所在的葉子節點從大根堆中取出。
4.取出後,繼續調整大根堆,即執行第2步,讓大數上沉,小數下沉。調整結束後,再執行第3步,直至排序完成。
動畫演示:
**如下:
void heapsort(int *ar, int count);
static void adjustheap(int *ar, const int count, int root);
//調整,讓大數上沉,小數下沉
static void adjustheap(int *ar, const int count, int root)
temp = ar[root];
ar[root] = ar[maxindex];
ar[maxindex] = temp;
root = maxindex; }}
void heapsort(int *ar, int count)
//取大數的操作。
while (count > 0)
}
接下來還有直接交換排序,快速交換排序,計數排序,桶排序,基排序等等。 全排序演算法
static void main string args int length arr.length int outarr new int length sortall arr,outarr,length console.writeline count static int count 0 stat...
PHP全排序演算法
題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和cba。st r get str ar r ar ray l strlen str 交換兩個字元的位置 function swapstr n1,...
排序演算法全分析
排序簡介 排序是資料處理中經常使用的一種重要運算,在計算機及其應用系統中,花費在排序上的時間在系統執行時間中占有很大比重 並且排序本身對推動演算法分析的發展也起很大作用。目前已有上百種排序方法,但尚未有乙個最理想的盡如人意的方法,本章介紹常用的如下排序方法,並對它們進行分析和比較。1 插入排序 直接...