我覺得氣泡排序是比較簡單的;
所以今天我們實現乙個叫做快速排序的;
problem
你想要將(4,3,5,1,2)排序成(1,2,3,4,5)
你決定使用最簡單的快速排序;
solution
首先,開啟你的terminal,我寫得c**通常都是用vi編輯,gcc編譯;
vim quicksortsample.c因為,快速排序需要對資料進行分割然後處理,再分割再處理;
顯然需要乙個遞迴的過程;
所以,我們先把遞迴結束條件寫好;
#include void quick_sort( int *a, int也就是說,當輸入只有乙個數字就沒有必要排序啦!直接返回;n)
void quick_sort( int *a, int注意: p = a[n / 2];的目地是獲取陣列中得中間位置的資料;n)
}
我們都知道,陣列下標是整數,因此,如果n=3那麼n/2應該是1,此時正好平分陣列;
若是,n=4那麼n/2應該是2,而此時它們就不完全是平分陣列啦;
for迴圈的作用是為了從前後兩個方向分別遍歷;
void quick_sort( int *a, int注意:我們在for迴圈中又進行啦while迴圈;n)
}
它的作用是對元素進行遍歷,假設左邊的資料沒有p中儲存的元素大,那麼繼續尋找,並且把i自增;
當找到比p大的或者相等得則停止第乙個while迴圈;
例如:如果陣列(2,5,3,1,4)那麼p顯然是3,當while迴圈發現5大於3時停止迴圈,此時i=1;
同理,第二個while迴圈中,p依然是3,當while迴圈第一次發現4大於3則繼續迴圈此時j=4;
當while迴圈到j=3時,得到的元素是1,1不大於3所以停止迴圈,此時得到的j=3;
好啦!那麼我們知道在for迴圈中沒有明確指定迴圈停止條件;
它該什麼時候停止呢?
void quick_sort( int *a, int注意:當i>=j意味著此時資料已經全部遍歷完了;n)
}
因為i與j分布在陣列左右兩部分,當它們重合,當然也就表明它們遍歷完啦;
剛才,我們的兩個while迴圈分別找到啦乙個左邊比p大得元素,和乙個右邊比p小的數字;
顯然這兩個元素應該交換位置的;
那麼怎麼實現呢;
void quick_sort( int *a, int我們看到了,在氣泡排序中也用到得交換語句;n)
}
此時我們完全遍歷了一遍陣列;
我們在main函式中測試一下;
#include void quick_sort( int *a, intmain函式的語句都非常容易懂,就不解釋啦;n)
}int main(void);
int n = sizeof a /sizeof a[0
];
inti;
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
quick_sort(a, n);
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
return0;
}
看看編譯執行的結果:
顯然,執行的結果是我們預期的;
3左邊的都比3小啦!那若果資料多一些呢;
比如我們會發現左邊有兩個元素都比3大,理論上要進行兩次交換;
顯然當它交換完[1]與[5]元素後,它又是怎麼繼續的我們關心這個問題;
顯然交換完資料後,又進入for迴圈;
for迴圈沒有結束條件,因此,i++,j--完成後,此時i=2,j=4;
接下來執行兩個while發現,第乙個while發現a[2]是7 不小於p此時不執行i++;
同樣在第二個while中也發現a[4]是-1不大於p此時不執行j--;
然後到if語句不成立,因此繼續進行資料交換;
測試如下資料;
#include void quick_sort( int *a, intn)}我們會得到如下結果:int main(void);
int n = sizeof a /sizeof a[0
];
inti;
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
quick_sort(a, n);
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
return0;
}
顯然,我們已經得到啦p左邊都是小於p的;
右邊則是大於p的;
符合我們的設想;
為了把整個陣列正確排序,我們需要分別又對兩部分重複一遍剛才的操作;
好,我們遞迴的呼叫函式,並且把陣列的兩部分元素傳遞到函式中;
void quick_sort( int *a, int注意:第乙個遞迴呼叫處理陣列的前部分,a對應的是陣列的首位址,i是指對應的元素個數;n)
quick_sort( a, i);
quick_sort( a + i, n -i);
}
第二個遞迴呼叫處理陣列後部分,a + i指的當然是首位址加偏移位址,如果你對偏移位址有問題的話,應該看看計算機定址方式的資料啦;
接下來看執行結果:
最後,我們把所有**附上:
#include void quick_sort( int *a, intn)
quick_sort( a, i);
quick_sort( a + i, n -i);
}int main(void);
int n = sizeof a /sizeof a[0
];
inti;
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
quick_sort(a, n);
for (i = 0; i < n; i++)
printf(
"%d%s
", a[i], i == n -1 ? "
\n" : "");
return0;
}
C語言實現快速排序
快速排序,是氣泡排序的改進,通過尋找 中間元素 在一趟排序中,把比 中間元素 小的數放到左邊,比 中間元素 大的數放到右邊,如此遞迴,最終得到排序結果。include define num 5 void quick sort int a,int left,int right void swap in...
c語言實現快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽結束...
快速排序 C語言實現
以前使用rm時,ruby指令碼提供乙個sort函式,可以把陣列進行排序,後來得知採用的演算法是快速排序。隨著資料結構課程的學習,快速排序如今也不再神秘,如下 using namespace std void quicksort int a,int low,int high int first low...