快速排序演算法C 實現 評注版

2021-09-02 23:23:31 字數 2191 閱讀 6390

經常看到有人在網上發快速排序的演算法,通常情況下這些人是在準備找工作,或者看《演算法導論》這本書,而在他們發布的**通常是差不多的版本,估計也是網上copy一下,自己改改,跑過了就算了,但是通常這樣玩根本沒有太大作用,如果到一家公司,給你一台不能上網的筆記本,20分鐘,你是根本寫不出來快速排序的演算法的,當然除了那些死記硬背的兄弟。

說說我寫這篇文章的目的吧,記得有一天我想重新看看《演算法導論》,看到快速排序我覺得很簡單,於是按奈不住,想動手寫寫,可是寫完了,在測試有些資料的時候總也過不去,於是我就想在網上找找按照《演算法導論》的提示邏輯寫成的快速排序,但是很是失望,網上差不多都是同乙個版本,而且不是我想要的,於是有了本文。

為了讓本文自成體系,先看看什麼是快速排序,快速排序是一種排序演算法。在平均狀況下,排序n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實作出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。

首先讓我們來看看《演算法導論》上面的演算法邏輯

quicksort(a, p, r)//快速排序演算法

if (p < r )

q = partition(a, p, r)//分成左右兩半,一半不大於a[r], 一半不小於a[r]

quicksort(a, p, q-1)//遞迴左半

quicksort(a, q+1, r) //遞迴右半

partition(a, p, r)

x = a[r]//選擇最後乙個元素作為比較元素

i = p – 1//這個慢速移動下標必須設定為比最小下表p小1,否則兩個元素的序列比如2,1無法交換

forj = ptor-1//遍歷每個元素

if (a[j] <= x)//比較

{

i = i + 1//移動慢速下標

exchange a[i] with a[j ]//交換

exchange a[i+1] with a[r]//交換

returni + 1//返回分割點

一次完整的比較過程如下圖:

演算法導論快速排序邏輯c++實現

//data swop function

void swap(int &p,int &q)                          

int temp = p;

p=q;

q=temp;

//partition function

int partition(int arrayinput,int nlow,int nhigh)                

int ntemp=arrayinput[nhigh];   

int i = nlow-1, j=nlow;  

for(; jif( arrayinput[j]<=ntemp )

i++;

if(i !=j )

swap(arrayinput[i], arrayinput[j]);

swap(arrayinput[i+1],arrayinput[nhigh]);

return (i+1);                                        

//quick sort

void quick_sort(int arrayinput,int nlow,int nhigh)            

if(nlow < nhigh)                                        

int nindex=partition(arrayinput , nlow, nhigh);                         

quick_sort(arrayinput , nlow, nindex-1);                           

quick_sort(arrayinput , nindex+1, nhigh);                           

總結

快速排序演算法實現(C版)

一趟快速排序的演算法 1 設定兩個變數i j,排序開始的時候 i 0,j n 1 2 以第乙個陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j j 1即j 找到第乙個小於key的值a j a j 與a i 交換 4 從i開始向後搜尋,即由前開始向後搜...

快速排序演算法及C 版的實現示例

演算法思想 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它...

快速排序演算法 c 實現

namespace backpackproblem backpack bp new backpack profit int start 0 int end profit.length 1 bp.quicksort profit,start,end bp.print class backpack 快速...