一直想研究一下快速排序,今天剛好有空,寫一下自己對快速排序的認識。
快速排序由於排序效率在同為o(n*logn)的幾種排序方法中效率較高,因此經常被採用。
該方法的基本思想是:
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步
驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:
先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有
幫助)。
給出乙個陣列a[10] 定義參考值temp = a[0] i = 0 j = 9
i移動判斷條件是(a[i]<=temp && i(
a[i]>=temp && i
a[9] < temp j = 9 不移動
去移動i 直到a[2] > temp
交換a[i] a[j]
然後j 繼續移動 找到a[8] < temp
i開始移動 找到a[3] > temp
交換a[a] a[j]
移動j a[7] < temp 移動 i a[5] > temp
交換a[i] a[j]
移動j a[5] < temp j=5 此時 i = j
將a[0] 與 a[5] 交換
初次排序已經完成,接著再分別按照上述方法將a[0] ~ a[4] a[6] ~ a[9]進行排序。
給出**,可以參考**理解。
#include
inta[101],n;
//定義全域性變數,這兩個變數需要在子函式中使用
void
quicksort(
intleft,
intright) }
//最終將基準數歸位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//繼續處理左邊的,這裡是乙個遞迴的過程
quicksort(i+1,right);//繼續處理右邊的 ,這裡是乙個遞迴的過程
} int
main()
快速排序分析
1.開篇 終於還是忍不住要學習一下演算法啦,該面對的還是要面對,不能逃避,不能把已經會的技能忘掉,那是一種對生命的摧殘和不仁。不要怕,只要每天都在進步,水滴石穿,終有破雲見天日的時刻。感慨寫完了,回到正題,分析快速排序。2.原理 假設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣...
快速排序分析
首先簡單描述一下快速排序 1.快速排序樹不穩定的 由於關鍵字的比較與交換是跳躍進行的 2.時間複雜度為o n logn 最好情況為n logn 若陣列基本有序為n n 3.空間複雜度為logn 主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度為log2n,其空間複雜度也就為o logn 最壞情況...
快速排序分析
前言 剛剛學習到快速排序,快速排序是個基礎問題,去網上查了下,發現竟然沒有乙個讓人滿意的答案。就連為什麼快速排序比氣泡排序快這個基本的概念,也沒人說清楚。一般而言,網上對於為什麼快速排序比冒泡快,有兩種方向 1.算時間複雜度 2.二分法的優越性 對於這兩種解釋,明顯沒有從根本上觸及原理。對於1.算時...