分治算法之快速排序
1、快速排序
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進行快速排序
2、思路
( 1 )分解:先從數(shù)列中取出一個元素作為基準(zhǔn)元素。以基準(zhǔn)元素為標(biāo)準(zhǔn),將問題分解為兩個子序列,使小于或等于基準(zhǔn)元素的子序列在左側(cè),使大于基準(zhǔn)元素的子序列在右側(cè)。
假設(shè)當(dāng)前待排序的序列為 R[low:high] ,其中 low ≤ high 。
步驟 1 :首先取數(shù)組的第一個元素作為基準(zhǔn)元素 pivot=R[low] 。 i=low , j=high 。
步驟 2 :從右向左掃描,找小于等于 pivot 的數(shù),如果找到, R[i] 和 R[j] 交換, i++ 。
步驟 3 :從左向右掃描,找大于 pivot 的數(shù),如果找到, R[i] 和 R[j] 交換, j?? 。
步驟 4 :重復(fù)步驟 2 ~步驟 3 ,直到 i 和 j 指針重合,返回該位置 mid=i ,該位置的數(shù)正好是 pivot 元素。
( 2 )治理:對兩個子序列進行快速排序。
( 3 )合并:將排好序的兩個子序列合并在一起,得到原問題的解。
3、代碼實現(xiàn)
#include <iostream>using namespace std;#define length 100//讓小于某個值的所以數(shù)排在它前面,所有大于它的數(shù)據(jù)排后面 void swap(int *a, int 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: 分治算法之合并排序
- 下一篇: 动态规划之两个字符串的最大子序列