我貼了上來:
vectorpartition(vector&arr, int lo, int hi)
else lo++;
} swap(arr[lo], arr[hi]);
//這個less 和 more+1 是為了防止對重複元素進行排序
return vector;
}void quicksort(vector&arr, int lo, int hi)
}void quicksort(vector&arr)
原答案:
快速排序演算法是一種分治策略的典型應用;它可以在o(1)時間內,由子問題的解直接得到原問題的解,但為了將原問題劃分為兩個子問題,卻需要o(n)的時間。
(此處借用鄧俊輝老師的資料結構書中的圖)
考察任一向量區間s[lo,hi),對於任何lo<=mi於是演算法就可以這樣遞迴下去:
template void quicksort(int lo, int hi)
於是找軸點是乙個比較關鍵的事情;
因為並非每個向量都必然包含軸點。所以這裡partition,就是為了構造出軸點;
template int partition(int lo, int hi, vector&send)
send[lo] = pivot;
return lo; //返回軸點
}
(借用鄧俊輝的資料結構的書)
所以上述查詢軸點的演算法的時間複雜度是與查詢的區間長度成正比關係,即o( hi - lo );
複雜度:
可以看出,由於partition()演算法在劃分出的子任務在規模上不僅不能保證接近,而且還可能相差懸殊。如果這是乙個全序的向量或者是全都一樣的向量,則每次劃分的子任務規模就為0和n - 1;則遞推關係如下:
t(n) =t (0) + t(n - 1) + o (n)
t(n) =t ( n - 2 ) + 2 o( n ) = ......=o(n^2)
於是最壞的情況是o(n^2);
但是在最佳情況下,是從陣列的中點開始分:t(n)=2*t(n/2)+n;
其時間複雜度為o(nlogn)
如果幾乎所有元素都是一樣的情況下,則整個演算法會退化成線性遞迴,遞迴深度為o( n ),導致總體執行時間為o(n^2)
於是可以對partition()稍微進行改進
template int partition(int lo, int hi, vector&send)
//將小於軸點的放在軸點的左邊
while (lo < hi)
if (send[lo] <= pivot)
lo++;
else //將大於軸點的放在軸點的右邊
} send[lo] = pivot;
return lo; //返回軸點
}
排序 快速排序(C )
1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...
排序 快速排序(C )
如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...
快速排序 c
快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。具體做法 1.選取集合最右端的元素作為乙個參照物,稱之為 樞紐 pivot 2.開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。3.根據分割位置,分別遞迴...