乙個暑假的閒暇,玩的是舒服了,可是腦子裡的各種演算法卻忘了,果然程式設計是個靠保持狀態的活,昨天覆習了便快排,拿出來寫個部落格加深個印象。
簡介:快排是基於分治模式的,它的平均時間複雜度為o(nlgn),最壞複雜度是o(n*n)。
思想:快排的其基本思想是,陣列中先隨機找個主元(pivot element),而將比主元小的數全放在主元左邊,比主元大的數放主元右邊,然後再將這個陣列根據主元拆分成左右兩個陣列,再根據上步驟進行排序拆分,直到所有拆分出的陣列只有乙個元素,即拆無可拆,也就是排序好了。
演算法導論給出的偽**是:
quicksort(a,p,r)
if pa,p,r)
quicksort(a,p,q-1)
quicksort(a,q+1,r)
partition(a,p,r)
x=a[r]
i=p-1
for j = p to r-1
do if
a[j]<=x
then i=i+1
exchange a[i]=a[j]
exchange a[i+1] a[r]
return i+1
其中偽**中的「=」其實是左箭頭,因為打著麻煩就換成」=」。
函式quicksort是遞迴式,partition 是具體的排序過程。
這裡就直接講解partition排序過程,其中主元它用的是陣列最後一位,然後設定乙個下標i=p-1即陣列頭的前一位,然後再遍歷陣列a[i],當遇到比主元小的,就讓i右移並讓i的元素與對比出的比主元小的元素置換,這樣遍歷完整個陣列後,就是把所有比主元小的元素全部移到了i的後邊,而比主元大的就在i的右邊。
根據這個原理再實現到c++上:
static void quicksort(int a,int s,int e)
j++;
} quicksort(a,s,i-1);
quicksort
a,i+1,e); } }
快速排序及C 實現
1.挑選乙個基準值 2.小於基準值的數放在大於基準值的數的左邊 3.將基準值放入中間,即兩種數分界的地方,根據挑選的基準值決定如何插入。4.此時,基準值左邊的區間小於等於基準值,基準值小於等於右邊的區間,這三段有序,但內部無序,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1。是乙個遞迴的過...
快速排序原理及C 實現
原理 快速排序,說白了就是給基準資料找其正確索引位置的過程.如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp 23 然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌 low指向起始位置,high指向末尾.首先從後半部分開始,如果掃瞄到的值大於基準資料就讓...
快速排序思想及C 實現
ste p1.step 1.step1.通過一趟排序把資料分成兩部分,其 中 color 其中一部分的所有資料都要比另一部分的所有資料小,基準資料 稱為樞軸 排在這兩個子串行的中間 s te p2.step 2.step2.對這兩個子串行遞 歸 color 遞迴地呼叫排序演算法 int partit...