排序 四 之快速排序

2021-09-29 04:32:22 字數 1845 閱讀 2864

快速排序應該時排序演算法中最好的一種,看看它的命名都顯得那麼誠實。快速排序也是我們必須掌握的一種排序演算法,因為面試的時候絕大概率是要出現的。

這裡假如資料array[10]進行排序

首先找個基準元素tmp,一般為第乙個資料(tmp = array[0], left = 0, rgint = 9)

從最右邊(right = 9)開始取出資料(array[9])與基準資料比較,比基準資料大,則不變(這裡預設排序完成時從小到大的),right–(這時right=8),繼續拿array[8]與基準資料比,直到array[right] 比基準數數小,這時把array[right] 的值賦給array[left]

從最左邊(left = 0)開始取出資料(array[0])與基準資料比較,比基準資料小,則不變(這裡預設排序完成時從小到大的),left++(這時left=1),繼續拿array[1]與基準資料比,直到array[left] 比基準數數大,這時把array[left] 的值賦給array[right]

迴圈 2、3步驟,直到left >= right

這時我們把資料分為兩個[0, left - 1] ,[right, 9],遞迴進行上面的1,2,3,4步驟。

直到陣列不能再分。

網上找個圖(還是看圖):

}當分割槽選取的基準元素為待排序元素中的最大或最小值時,為最壞的情況,時間複雜度和直接插入排序的一樣,移動次數達到最大值max = 1+2+…+(n-1) = n*(n-1)/2 = o(n2) 此時最好時間複雜為o(n2)

當分割槽選取的基準元素為待排序元素中的"中值",為最好的情況,時間複雜度為o(nlog2n)。

快速排序的空間複雜度為o(log2n).

當待排序元素類似[6,1,3,7,3]且基準元素為6時,經過分割槽,形成[1,3,3,6,7],兩個3的相對位置發生了改變,所是快速排序是一種不穩定排序。

sort.c

int

main

(int argc,

char

**ar**)

;int buf=

;//int buf[10]=;

length =

sizeof

(buf)

/sizeof

(int);

// heap_sort(buf-1, length);

// shell_sort(buf, length, 2);

quick_sort

(buf,

0, length -1)

;for

(i =

0; i < length; i++

)printf

("%d\t "

, buf[i]);

printf

("\n");

return0;

}

結果輸出:

排序(四)之快速排序

快速排序法相交之前的三種排序法來講,是一種執行速度較快的排序演算法,也是一種大家經常使用的排序演算法。快速排序法使用一種分治的思想,將待排陣列切分成兩個子陣列,將兩個子陣列進行獨自的排序。快速排序法與歸併排序不同,歸併排序是將兩個有序的子陣列分別排序,然後將兩個子陣列歸併後形成乙個有序的陣列。而快速...

排序之快速排序

快速排序的在內排中起到比較重要的作用,平均時間複雜度達到o nlogn 公升序快速排序 1 int partition vector vi,int start,int end 11 vi start key 12return start 13 14void quickcore vector vi,i...

排序之快速排序

有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方...