資料結構與演算法之一快速排序

2021-06-17 19:24:15 字數 1981 閱讀 9241

快速排序採用的是分治法,何為分治?意思是將原問題分解為若干個規模更小但結構與原問題相似的子問題,遞迴地解這些子問題(在程式中就是遞迴呼叫),然後將這些子問題的解組合為原問題的解。

快速排序的基本思想:

①分解:

在陣列r中任選乙個數作為基準(pivot),習慣上把第乙個數作為基準,以此基準(pivot)將當前無序區劃分為左、右兩個較小的子區間r[low...pivotpos-1]和r[pivotpos+1...high],並使左邊子區間中所有的數均小於等於基準,右邊的子區間中所有的數均大於等於基準,而基準pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1](即為陣列中第low個數到第pivotpos-1個數)≤r[pivotpos](基準)≤r[pivotpos+1..high]

其中low≤pivotpos≤high。

②求解:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

快速演算法:quick_sort

void quick_sort(int a,int low,int heigh) //對a[low..heigh]快速排序

{int pivot_pos; //劃分後基準的位置

if(low(1) 簡單的劃分方法

① 具體做法

第一步:(初始化)設定兩個指標i和j,它們的初值分別為區間的下界和上界,即i=low,i=high;選取無序區的第乙個記錄r[i](即r[low])作為基準記錄,並將它儲存在變數pivot中;

第二步:令j自high起向左掃瞄,直到找到第1個小於pivot的數r[j],將r[j])移至i所指的位置上,這相當於r[j]和基準r[i](即pivot)進行了交換,使小於基準pivot.的數移到了基準的左邊,交換後r[j]中相當於是pivot;然後,令i指標自i+1位置開始向右掃瞄,直至找到第1個大於pivot的數r[i],將r[i]移到i所指的位置上,這相當於交換了r[i]和基準r[j],使大於基準的數移到了基準的右邊,交換後r[i]中又相當於存放了pivot;接著令指標j自位置j-1開始向左掃瞄,如此交替改變掃瞄方向,從兩端各自往中間靠攏,直至i=j時,i便是基準pivot最終的位置,將pivot放在此位置上就完成了一次劃分。

劃分演算法:partitions

整體程式:

#include

using namespace std;

int partitions(int a,int i,int j);

void quick_sort(int a,int low,int heigh);

int main()

{int r[10],i;

cout<

for(i=0;i<10;i++)

cin>>r[i];

quick_sort(r,0,9);

cout<

for(i=0;i<10;i++)

cout<=pivot) j--;

if(ivoid quick_sort(int a,int low,int heigh)

{int pivot_pos;

if(low注意:此程式最容易出錯的地方是在函式的宣告處,在c++的某本書中有提到,對函式進行提前宣告時,可以只寫函式引數表中的引數型別,不需要寫引數名,但是在本程式中若在函式宣告時只寫引數型別,編譯不通過。 

演算法與資料結構(一) 快速排序

原理 在序列中找乙個基準數,然後,通過一定的次序調整 如交換位置或不斷填坑的方式 使得這個基準數的位置前面的數都小於基準數,後面的數都大於這個基準數,那麼,就找到了這個基準數的位置,然後,不斷地遞迴這個過程。演算法步驟 1.找乙個基準數,一般為待排序序列左邊的第乙個,並且把這個位置作為第乙個坑,並儲...

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法之一

電腦科學是通過使用計算機解決各種問題的研究領域。為了使用計算機解決給出的問題,您需要為其設計演算法。可設計多個演算法來解決特定的問題。提供了最大效率的演算法應用於解決此問題。演算法的效率可通過使用合適的資料結構來改善。資料結構幫助建立簡單 可重用和易於維護的程式。本模組允許學員選擇並實現合適的資料結...