排序演算法小全《上》

2021-10-01 14:58:13 字數 3375 閱讀 6201

從最簡單的排序開始,前人們一直在這不斷追尋著這個看似簡單的問題的最優解。

筆者也將自己對於這些不同排序演算法的認識,見解記錄下來。

目前記錄了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 插入排序 直接...