[英]Sorting arrays with Quicksort C++
我正在(學校)項目中工作,其中一項要求是對數組進行排序。 因此,我決定使用quicksort。 (我之所以選擇它,是因為它是一種我現在不知道的算法),我設法理解了它的工作原理,並且還找到了在c ++中實現它的選擇。
void quicksort(size_t v[], size_t start_pos, size_t end_pos)
{
size_t i, j, di, dj;
if (start_pos < end_pos)
{
i = start_pos, j = end_pos;
di = 0, dj = 1;
do
{
while (i < j && (v[j] > v[i] || v[j] == v[i])) i += di, j -= dj;
if (i < j)
std::swap(v[i], v[j]), di = (di + 1) % 2, dj = (dj + 1) % 2;
} while (i < j);
if (i - start_pos > 1)
sort(v, start_pos, i - 1);
if (end_pos - i > 1)
sort(v, i + 1, end_pos);
}
}
我不明白的是...如果在最后2個語句中使用“> 1”,為什么呢? 我希望有人可以為我澄清這一點。 謝謝! :)
兩種計算都分別提供了左和右細分的大小。
如果大小為1或零,則說明該部分已經排序,不需要任何進一步的處理。
if (i - start_pos > 1)
sort(v, start_pos, i - 1);
僅當范圍是兩個或更多元素時才進行排序調用。 正如Barry所指出的,這可能應該是
if (i - start_pos > 1)
quicksort(v, start_pos, i - 1);
維克多斯的評論也很重要。
如果仔細看,代碼的上半部分將安排與樞軸元素相對應的數組,該元素在i處索引,最后兩個if對其余部分(即樞軸元素的左右)進行排序,但是如果您的樞軸索引已經到達end_pos,您不需要在數據透視元素的右邊對元素進行排序,因此存在一個條件是否i <end_pos。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.