演算法 二 快速排序的兩種實現方法

2021-08-07 03:17:14 字數 1474 閱讀 3568

快速排序的原理是有序的陣列(順序)一定滿足這樣的充分必要條件,對所有的元素而言(亦即每乙個元素都可以作為基準元素),每乙個比自己大的元素都排列在自己的身後,每乙個比自己小的元素都排列在自己的身前。

所以,快速排序的步驟是:

1. 選定乙個基準元素(有很多種方法,如隨機、第乙個元素、中間的元素……,隨你所願);

2. 建立兩個游標,乙個用於從後向前檢索比基準元素小的元素,乙個用於從前向後檢索比自己大的元素;

3. 如果檢索到了這樣的元素,則進行交換,交換的規則是:

假定小元素的位置j,大元素的位置為i,基準為k,基準元素為p,陣列為a,那麼步驟是:

1. 小的元素放置在基準位置,即a[k] = a[j], k = j;

2. 小的元素位置放置大的資料,即a[k] = a[i], k = i;

3. 新的基準位置放置基準資料,即a[k] = p;

4. 不斷重複步驟2,直到兩個游標相遇;

5. 在游標相遇的位置劃分出2個新的排序區間,然後對每個區間進行1-4步,直到劃分不出新的區間為止;

根據上面的步驟,我們可寫出第一種寫法(遞迴寫法):

static

int sort(int nums, int start, int end)

if(end > start)

// 排除基準元素(即第乙個元素),需要使用<=判斷

while(end > start && nums[start] <= pivot)

if(end > start)

nums[k] = pivot;

}// 返回相遇位置

return k;}//

static

void quicksort(int nums, int start, int end)

// 如果只有乙個元素,沒有繼續的必要

if(mid + 1

< end)

}

根據上面的**,我們可以很容易寫出第二種實現方法——迴圈實現方法:

static

void quicksortarr(int nums) );

while(!stack.isempty())

if(i < j)

// 第二種解決辦法

// 避免起始位置死迴圈的方法

// while(i < j && nums[i] <= pivot)

while(i < j && nums[i] < pivot)

if(i < j)

nums[k] = pivot;

}if(k - 1 > start) );

}if(k + 1

< end) );}}

}

快速排序的難點在於對兩個掃瞄索引的理解,尤其是相遇時就是基準元素的正確位置,理解了這個知識點,快速排序就易於反掌。

快速排序的兩種演算法

假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。先將第乙個數當成基準數,然後以i,j當成哨兵分別指向陣列的首尾,第一次讓j先移動,移動到比基準數小的數字時停下,然後讓i移動至比基準數大的數字停下,交換arr i 和arr j 一直遍歷,知道i和j兩個哨兵相遇停止,然後...

快速排序的兩種實現

快速排序演算法是現在用的最廣的排序演算法,也是效率最高的。它有兩種實現方式,一種是定軸法,另外一種是挖坑法。這裡簡單介紹一下兩種實現方法的思想,並附上c 實現 一 定軸法 1.備份對軸 首記錄 2.取兩個指標left和right,初始值分別是序列的第二個元素和最後乙個元素,並且left right ...

兩種快速排序

快排是一種基於交換的排序,氣泡排序 兩兩相鄰作比較,逆序則交換 也是基於交換的排序,快排運用了二分法的思想,每次找乙個哨兵,比哨兵小的放一邊,大的放一邊,這是完成了一趟快排。冒泡 for int i 0 ia j 1 快排一 void quicksort int left,int right if ...