C 快速排序

2021-09-26 16:22:05 字數 1602 閱讀 7152

快速排序和氣泡排序的原理是差不多的,但是快速排序交換位置是跳越的,所以有些時候它的複雜程度會優於氣泡排序。它的最差時間複雜度為o(n^2),但是它的平均複雜度為o(n*logn)。

首先,我們來對一組數進行排序

6 1 2 7 9 3 4 5 10 8

第一步,創立乙個陣列ar[10],我們需要尋找乙個基準數,我們就規定最左邊乙個數為基準數。

61 2 7 9 3 4 5 10 8

然後從兩邊開始搜尋(如果基準數在左邊,就先從右邊搜尋,反之則搜尋順序反過來),把比基準數小的放在左邊,比基準數大的放在右邊。

i=0 j=9

從j- -開始

j=9 ar[j]=8 —— j=8 ar[j]=10 —— j=7 ar[j]=5比6小

然後開始i++

i=0 ar[i]=6 —— i=1 ar[i]=1 —— i=2 ar[i]=2 —— i=3 ar[i]=7比6大

最後交換此時ar[i]和ar[j]的數,順序就變為

61 2 5 9 3 4 7 10 8

然後從這個位置接著進行搜尋,直到i和j相等。

從j- -開始

j=7 ar[j]=7 —— j=6 ar[j]=4比6小

然後i++

i=3 ar[i]=5 —— i=4 ar[i]=9比6大

最後交換此時ar[i]和ar[j]的數,順序就變為

61 2 5 4 3 9 7 10 8

然後繼續

從j- -開始

j=6 ar[j]=9 —— j=5 ar[j]=3比6小

然後i++

i=4 ar[i]=5 —— i=5 此時i=j

所以交換基準數與ar[i]或者ar[j]交換

最後得到順序為

3 1 2 5 469 7 10 8

這樣6就在第6位上,所以6的位置就排好了。

我們再分別排6的左右兩邊,也就是3 1 2 5 4和9 7 10 8就好了。

這裡我們用遞迴的思想就可以。

#includeusing namespace std;

int ar[101],n; //定義全域性陣列

void quick_sort(int left,int right)

int i,j,temp,tt;

temp=ar[left];//把最左邊的定義為基準數

i=left,j=right;

while(i!=j)

while(ar[i]<=temp &&iif(i} ar[left]=ar[i];//交換基準數的位置

ar[i]=temp;

quick_sort(left,i-1);

quick_sort(i+1,right);

}int main()

quick_sort(1,n);

for(int i=1;i<=n;i++)

return 0;

}

排序 快速排序(C )

1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...

排序 快速排序(C )

如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...

快速排序 c

快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。具體做法 1.選取集合最右端的元素作為乙個參照物,稱之為 樞紐 pivot 2.開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。3.根據分割位置,分別遞迴...