各種排序演算法

2021-07-11 03:51:40 字數 3742 閱讀 2187

快速排序

快速排序作為複雜排序中最好用的排序演算法,作為程式設計師是必須要掌握的。

先說說排序演算法的思路,我們對照著下圖慢慢說。

比如我們有乙個陣列:

角標 0 1 2 3 4 5 6

陣列 6 4 7 3 9 2 8

我們隨便選擇乙個值為基準數x,我們這裡選擇0位置的數字6,x=6。然後我們建立兩個游標 i和j 。因為我們是要對整個陣列進行排序,那麼我們就給游標乙個初始值: i = 0 ,j = 6 。

初始化的工作完成了,接下來是排序的核心內容了。

第一步,把比基準數大的數放在右邊,把比基準數小的數放左邊。

我們從右邊開始向左移動游標j,選擇乙個比基準數小的數放到基準數的位置。當j為5的時候,發現2小於等於6。

角標 0 1 2 3 4 5 6

陣列 2 4 7 3 9 ? 8

接下來我們從左邊開始向右移動游標i,選擇乙個比基準數大的數放到之前空去來的位置。當i移動到2的時候,發現7大於等於6。

角標 0 1 2 3 4 5 6

陣列 2 4 ? 3 9 7 8

然後我們又由右向左移動j,找乙個大於6的值。是不是有種盪鞦韆的感覺

角標 0 1 2 3 4 5 6

陣列 2 4 3 ? 9 7 8

之後我們向右移動i,當為3的時候,i就和j相等了!我們把基準數賦值給這個『?』,第一步就完成了!

角標 0 1 2 3 4 5 6

陣列 2 4 3 6 9 7 8

我們可以發現比基準數小的數在基準數的左邊,比基準值大的數在基準數的右邊,而基準數的位置就是最終排序結果的位置。

第二步,我們把基準數左邊和右邊都提取出來,得到兩個小的集合。

角標 0 1 2 

陣列 2 4 3

角標 0 1 2 

陣列 9 7 8

我們把這兩個陣列分別使用第一步的方法,接著分下去。分到的集合繼續分下去,直到不能分下去為止。因為這種分割的方法,我稱它為二分法。

我找到了一幅圖,可能會比較形象,容易大家理解。

/// /// 快速排序

///

/// 需要排序的集合

/// 開始位置的角標

/// 結束位置的角標

public void quicksort( int arrayaway, int left, int right)

else

}//從左至右移動,找到乙個比基準數大的數,把這個數放到之前空出的位置(角標為j的位置)上。

while (i < j)

else}}

//第一步的最後,將基準值放到i=j的位置。

arrayaway[i] = x;

//第二步,我們遞迴這個方法

quicksort( arrayaway, left, i - 1);

quicksort( arrayaway, i + 1, right);}}

怎麼樣?是不是很簡單!大家去試試吧!

直接插入排序

還是先講講思路,我們從陣列第二個資料開始遍歷,將這個數和他前面的數進行比較,如果前面的數大於這個數,就將前面數的位置向後移動一位,不大於就將這個數放到前面位置的後面一位(原地不動),遍歷完了沒有插入就放到角標為0的位置。

思路說的有點繞,我們以乙個例項來詳細說明。

角標 0 1 2 3 4 5 6

陣列 6 4 7 3 9 2 8

我們從角標為1的位置,這個位置的數是4,拿他和前面比較,6大於4,把6移動到角標1的位置,然後繼續遍歷,遍歷完沒有插入,把這個數放到角標為0的位置。

角標 0 1 2 3 4 5 6

陣列 4 6 7 3 9 2 8

我們繼續選擇2號位置的7,將7和前面的數比較,6小於7,那麼7的位置不變。

我們選擇角標為3的數3,拿它和前面的數比較,3小於4、6、7,7、6、4依次向後移動一位,3沒有插入,我們把他放到角標為0的位置。

角標 0 1 2 3 4 5 6

陣列 3 4 6 7 9 2 8

說到這,其實思路已經很清楚了,也沒有再繼續囉嗦的必要了。我們使用**來實現這個思路。

void insertsort(int arrayaway)

else

}if (!flag) arrayaway[0] = x;}}

氣泡排序先說說思路。從右往左相鄰的兩個數兩兩比較,把小的數放前,一次迴圈,把最小的數放到最前面。然後將除了最前面乙個數從右至左兩兩比較,確定第二小的數,這樣依次從前往後確定數的位置,實現排序。我們來看圖說話:

從角標為5的位置開始,1、3比較,1小,1放前面,然後1、6比較,1小,放前面,依次這樣,將1放到最前面。就實現了最小值放最前面。

我們用**來實現這個思路:

void bubblingsort(int arrayaway)}}

}

來看一張圖便於理解氣泡排序:

簡單選擇排序

簡單選擇排序和氣泡排序有點相似,都是通過迴圈來找到最大數/最小數,然後找到第二大/小的數,不同的是氣泡排序是在不斷的交換來事件排序,而選擇排序是直接在裡面找到我們想要的數。

以0號位置的數42為基準數,假設他為最小值,遍歷它後面的數,如果有比他小的數就記錄下來,和0號位置的42交換,那麼就找到了第一小的數。接著從1號位置開始,假設為最小值,遍歷後面的數找到第二小的數,以此類推實現排序。

我們用**來實現這種排序:

void selectsort(int arrayaway)

{for (int i = 0; i < arrayaway.length - 1;i++ )

{int min = arrayaway[i];

int minindex = i;

for (int j = i + 1; j < arrayaway.length;j++)

{if(arrayaway[j]

簡單選擇排序示意圖:

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...