演算法是程式設計的靈魂,可見其重要,開發者,無論學什麼語言,都必須掌握常見的演算法。今天,筆者就和大家分享下,對常見演算法~快速排序法的理解,它是氣泡排序的一種該進。基本思想是:通過一遍排序將排序的資料劃分為兩個部分,使其中一部分,比另一部分資料小,然後再分別對這兩部份資料繼續進行這種排序,按此規則繼續,知道每個部分為空,或者只含有乙個數,整個快速排序結束。
演算法描述
1)從數列中挑出乙個元素,稱該元素為基準。
2)掃瞄一遍數列,將所有比基準小的元素,排在基準前面,所有比基準大的元素排在基準後面
3)通過遞迴,將各個子串行劃分為更小的序列,直到把小於基準值的子數列和大於基準的元素的子數列排序。
下面以一組代排序數列演示快速排序的過程,假設有8個需要排序的資料序列如下:
69,65,90,37,92,6,28,54
不妨設陣列a存這八個數,其排序過程如下:
1、在變數left
中儲存陣列最小的序號0,在變數right中存陣列最大的序號7,在變數base中儲存陣列最後元素a
2、從陣列右側開始,逐步取出元素與base比較,知道找到,比base小的資料為止
3、將右側與基準小的數存到a【left】
4、從陣列左側開始逐步取出元素與base比較,知道找打比base大的資料為止,
5、將左側比基準大的數儲存a【right】
6、將base中儲存的值儲存到a【left】中,經過這些運算,得到上述第二個圖,經過這次分割,base左側即left所指向的資料,比base小,右側比之大
7、接下來,通過遞迴呼叫,將left左側資料進行同樣的排序,,再將left右側資料進行同樣的排序
這樣便可以完成排序操作,偽**如下:
void 快速排序(陣列,左側序號,右側序號)
c語言描述:
void quicksort(int a,int left,int right)
{ int i,j;
if(left
int division(int a,int left,int right)
{ int base=a[left]; //取左側元素為基準元素
while(leftbase) //從右向左尋找第乙個比基準小的元素
--right;
a[left]=a[right]; //將比基準小的元素移到左側
while (left
#include #include #define arraylen 10
int createdata(int arr,int n,int min,int max) //建立乙個隨機數組,a儲存生成的資料,n為陣列元素的數量
{ int i,j,flag;
srand(time(null));
if((max-min+1)base)
--right; //從右向左找第乙個比基準小的元素
a[left]=a[right];
while(left
常用排序演算法之快速排序
快速排序 快速排序也是一種分治的遞迴演算法。取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端 右端...
常用排序演算法之快速排序
快速排序最壞情況執行時間為o n2 但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好 期望的執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。快速排序主要利用了分治的思想。一般分為三步進行 分...
常用演算法之快速排序
演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...