內部排序 交換類排序 快速排序

2021-08-27 21:46:19 字數 1267 閱讀 5335

在氣泡排序中,由於掃瞄過程中只對相鄰的兩個元素進行比較,因此在互換兩個相鄰元素時只能消除乙個逆序,如果能通過兩個(不相鄰的)元素的交換,消除待排序記錄中的多個逆序則會大大加快排序的速度。快速排序方法中的一次交換可以消除多個逆序。

演算法思想:從待排序記錄序列中選取乙個記錄(通常選取第乙個記錄)為樞軸,其關鍵字設為k1 然後將其餘關鍵字小於k1的記錄移到前面,而將關鍵字大於k1的記錄移到後面,結果將待排序序列分成兩個子表,最後將關鍵字為k1的記錄插入到其分界線的位置,將這個過程稱為一趟快速排序。通過一次劃分後就以關鍵字為k1的記錄為界將待排序序列分成兩個子表,且前面子表中的關鍵字均不大於k1,而後面子表中的所有記錄的關鍵字均小於k1。對分割後的子表繼續按上述原則進行分割,直到子表的長度不超過1為止。此時待排序記錄序列就變成了乙個有序表。

演算法步驟:假設待劃分序列為r[left],r[left+1],...r[right],具體實現上述過程時,可以可以設兩個指標i,j 他們的初值可以分別為left和right。首先將基準記錄r[left]移至變數x中,使r[left] 即r[i]相當於空單元,然後反覆進行如下兩個掃瞄過程,直到i和j相遇。

當i和j相遇時,r[i](或r[j])相當於空單元,且r[i]左邊所有記錄的關鍵字均不大於基準記錄的關鍵字,而r[i]右邊所有記錄的關鍵字均不小於基準記錄的關鍵字。最後將基準記錄移至r[i]中就完成了一次劃分過程,對於r[i]左邊的子表和右邊的子表可以採用同樣的方法進行進一步劃分。

排序過程如下所示:

兩種實現方式 **如下

第一種方式

int  qkpass(int r,int low ,int high);

void qksort(int r,int low,int high);

//完整的快速排序演算法 (方式一)

void qksort(int r,int low,int high){

int pos;

if(low=x)//high從右到左找小於x的記錄

high--;

if(low

void quicksort(int r,int left,int right){ //方式二

int key=r[left];

int low=left;

int high=right;

if(lowkey&&low

交換類排序之快速排序

packagesort.algorithm 快速排序演算法 是一種交換排序 publicclassquiksort quiksort sort newquiksort sort.sortarray data,0,data.length 1 for inti 0 i data.length i sys...

快速排序 氣泡排序 交換類排序 講解

每一趟排序選擇當前序列中的第乙個關鍵字 通常是第乙個 作為樞紐,而快速排序要做的就是把比樞紐小的關鍵字交換到樞紐前面,比樞紐大的關鍵字交換到樞紐後面。本趟排序完後會生成新的子串行,而子串行會成為下一趟排序的初始序列。通過例子來講明快速排序的規則 總結而言就是 首為樞紐,左i右j,先j後i,j從右向左...

內部排序演算法(一) 交換排序(氣泡排序,快速排序)

這是我的博文系列 內部排序演算法 的第一篇。所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。所謂內部排序,是指在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內 外存交換 外排序的定義則相反 內部排序法按照策略可以劃分為五類 插入排序 選擇排序 交換排序 歸...