描述:
圖示:
當a[j] < a[r]時候,a[j]應該被放入黑色框中,於是將a[i]與a[j]交換。當p==r時,a[i+1]就要與a[r]交換,即a[r]位於小子陣列和大子陣列之間。
演算法描述:
partirion(a,p,r) //a為陣列,p為需要劃分的起始元素,r為需要劃分的終止元素
x = a[r] //pivot
i = p-1
for j = p to r-1
ifa[j] <= x
i = i+1
swap(a[i],a[j])
swap(a[i+1],a[r])
return i+1 //返回主元的位置,並以主元為分界,對其兩邊的子陣列進行遞迴呼叫。
快速排序思想(edit on 12th nov,2015):
上述圖中的i j 兩個指標,實則是分別指向陣列的兩個部分。在某乙個時刻,我們需要排序的陣列應該是這個樣子的。
i 指標將會一直指向第乙個部分的最後乙個元素,我們稱之為s1[last]。而j 指標將會一直指向第三部分的第乙個元素,我們稱之為s3[first]。
為什麼這麼設定?
變種演算法
尋找最小的k個數:有n個整數(陣列s),請找出其中最小的k個數。
演算法:現有n個紅白藍 三種不同顏色的小球,亂序排在一起,請通過兩兩交換任意兩球,使得從左至右的球依次是紅,白,藍。
圖示如下(edit on 16th nov 2015)
有沒有覺得這種模式很熟悉,這就是我們傳說中的快排的思想。於是我們有了如下這個圖。表示某個時刻這些球的分布狀態。
我們將其分為四個部分s1
,s2
,s3
,s4
,分別代表著紅球的集合,白球的集合,還未分類的球的集合,和藍球的集合。指標begin
指向s2[0]
,current
指向s3[0]
,end
指向s4[0]
。接下來就是如何做操作的問題了。
二分查詢演算法及其變種
前言 二分查詢演算法也稱為折半查詢演算法,是一種在查詢演算法中普遍使用的演算法。其演算法的基本思想是 在有序表中,取中間的記錄作為比較關鍵字,若給定值與中間記錄的關鍵字相等,則查詢成功 若給定的值小於中間記錄的關鍵字,則在中間記錄的左半區間繼續查詢 若給定值大於中間記錄的關鍵字,則在中間記錄的右半區...
二分查詢演算法及其變種
前言 二分查詢演算法也稱為折半查詢演算法,是一種在查詢演算法中普遍使用的演算法。其演算法的基本思想是 在有序表中,取中間的記錄作為比較關鍵字,若給定值與中間記錄的關鍵字相等,則查詢成功 若給定的值小於中間記錄的關鍵字,則在中間記錄的左半區間繼續查詢 若給定值大於中間記錄的關鍵字,則在中間記錄的右半區...
演算法 二分查詢及其變種
二分查詢的前提條件是序列是有序的!時間複雜度log n 需要注意的幾個地方 public intfindtarget int nums else return 1 沒找到 返回 1 需要注意的地方 public intfindtargetleft int nums else return l 同樣如...