複習了一下快速排序,又忘了,這次加深一下印象。
首先看一下快排的實現過程
利用分治的思想,把乙個數字一分為二,接著對子陣列進行同樣的操作,直到陣列小到我們可以輕易進行排序為止。貼一下偽**
quick_sort
(a,left,right)
if left
p=partition
(a,left,right)
quick_sort
(a,left,p-1)
quick_sort
(a,p+
1,right)
end if
可以看出這一步非常簡單,就是乙個不斷分割,不斷遞迴的過程,其中最關鍵的一步就是partition這個函式,這個函式是乙個非常關鍵的操作,我們看一下這個操作的偽**
partition
(a,left,right)
if left
i=left,j=right,x=a[low]
//i和j相當於兩個指標,乙個從左往右進行查詢,另乙個從右往左進行
while
(i>=x)
//與x進行比較,直到j小於x
j--end while
if(i
a[i]
=a[j]
//把比x小的數j賦值給i指向的位置,不要怕i處的位置丟失,因為i現在的值已經賦給了x
i++end if
while
(i<=x)
//同理
i++end while
if(i
a[j]
=a[i]
j--end if
end if
x=a[i]
return i
雖然我在**注釋裡已經說得很清楚了,但是為了加深印象,我貼幾張圖演示一下partition的排序過程。
partition最後一步的時候千萬別忘了把x再賦給i
最後,是完整的c++源**:
/*date: 2023年1月6日
author: chauncy*/
#include
using
namespace std;
intpartitions
(int a,
int low,
int high)
a[i]
= x;
//把最開始取出來的x放到i處
return i;
}void
quicksort
(int a,
int low,
int high)
}int
main()
quicksort
(b,0
,n-1);
for(
int i=
0;i)return0;
}
分治演算法之快速排序
快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...
分治之歸併,快速排序
所謂歸併排序,就是把一段需要排序的序列分成2部分,分別完成排序之後,然後進行合併,從而完成對整個序列的排序。眾所周知,歸併排序用了分治的思想,即把原任務分成和原任務相同,但規模更小的幾個子問題。分別解決,從而達到解決原問題的效果。ex 給定以下陣列a 10 要求按從大到小的順序排序,歸併的思路如下 ...
分治之歸併,快速排序
所謂歸併排序,就是把一段需要排序的序列分成2部分,分別完成排序之後,然後進行合併,從而完成對整個序列的排序。眾所周知,歸併排序用了分治的思想,即把原任務分成和原任務相同,但規模更小的幾個子問題。分別解決,從而達到解決原問題的效果。ex 給定以下陣列a 10 要求按從大到小的順序排序,歸併的思路如下 ...