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