算法——快速排序

快排

​ 從頭開始學習算法,從最簡單的排序算法開始,第一個接觸的就是快排,學習的平臺是 AcWing,希望現在學習還不晚,對以後能有幫助

快排的原理

​ 快排使用的是分治的思想,有三個關鍵點:確定分界點、調整區間、遞歸處理左右兩段,這裏的思想是使用兩個指針,分別對應數組的左右邊界,一下簡稱 l 和 r,通過循環來將兩個指針向中間移動直到 l 和 r 相遇,在這期間,將數組調整爲小於等於分界點的值和大於等於分界點的值兩部分,再使用遞歸的思想處理

​ 首先要做的是確定一個分治的分界點,這個點可以是任意的一個數組元素,但不要給它設置成固定值,最好通過變量來對它進行定義,例如 array[l]、array[r]、array[(l + r) / 2] 這種都可以

​ 然後通過分界點的值來調整數組空間,,這裏需要用到剛纔提到的 l 和 r 兩個指針,過程是:先將 l 向後移動,檢驗 l 對應的值是否小於分界點,如果小於則繼續後移 l,否則 l 就會停下,這是 r 開始前移,檢測移動後的 r 所對應的值是否大於分界點,如果大於則繼續前移 r,否則 r 也會停下,這個時候 l 和 r 都已經停下了,說明 l 和 r 都已經遇到了不屬於自己對應空間的值,直接交換兩個指針當前所對應的值,然後繼續移動 l 和 r 指針,直到 l 和 r 相遇

​ 最後便是使用遞歸的思想,對分界點左邊(大小意義上的左,並非是排序上的左)和分界點右邊的元素再進行第二步的過程,當最後一次遞歸結束後,數組便完成了排序

代碼

void quick_sort (int[] arr, int l, int r) {
    if (l == r)
        return;
//x:分治變量 循環變量需在兩側邊界外一個偏移量的位置,因爲每次都是先讓指針後/前移一格,所以循環變量需要在邊界的前/後一個偏移量的位置
    int x = arr[l], i = l - 1, j = r + 1;
	while (i < j) {
        do
        	i++;
    	while (arr[i] < x);
    	do
        	j++;
    	while (arr[j] > x);
    	if (i < j) 
       		swap(arr[i], arr[j]);
    }
    quick_sort(arr, l, j);
    quick_sort(arr, j + 1, r);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章