我試過了一堆不同的方法來寫這個,但大多數時候我陷入了一個無限循環。 這個版本的代碼根本沒有排序,我不知道問題是什麼。需要C++中的快速排序算法(嘗試)的幫助
void quickSort(int unsorted[], int left, int right) {
int i = left, j = right;
int pivot = (left + right)/2;
while (i == pivot || j == pivot) {
if (unsorted[i] >= unsorted[pivot] && unsorted[pivot] >= unsorted[j])
swap(unsorted[i], unsorted[j]);
if (i < pivot)
i++;
if (j > pivot)
j--;
};
if (left < j && unsorted[left] != unsorted[j])
right = pivot, quickSort(unsorted, left, right);
if (i < right && unsorted[right] != unsorted[i])
left = pivot +1, quickSort(unsorted, left, right);
}
unsorted
是填充有從0 100個隨機值200
我爲更新緩慢遺憾的陣列。 關於代碼,我重新編寫了大部分代碼。 這是它看起來像現在:
void quickSort(int unsorted[], int left, int right)
{
int i = left,
j = right,
count = 0;
int pivot = (left + right)/2;
do
{
while (unsorted[i] < unsorted[pivot])
i++;
while (unsorted[j] > unsorted[pivot])
j--;
if (unsorted[i] >= unsorted[j] && i <= j)
{
swap(unsorted[i], unsorted[j]);
i++;
j--;
count++;
}
if (i == pivot && unsorted[pivot] < unsorted[j] && count == 0)
{
swap(unsorted[i], unsorted[j]);
i++;
j--;
count++;
}
if (j == pivot && unsorted[pivot] < unsorted[i] && count == 0)
{
swap(unsorted[i], unsorted[j]);
i++;
j--;
count++;
}
if (i == j && unsorted[i] > unsorted[pivot] && count == 0)
{
swap(unsorted[i], unsorted[pivot]);
i++;
j--;
count++;
}
if (i == j && unsorted[i] < unsorted[pivot] && count == 0)
{
swap(unsorted[i], unsorted[pivot]);
i++;
j--;
}
count = 0;
} while (i < j);
if (left < j)
quickSort(unsorted, left, j);
if (i < right)
quickSort(unsorted, i, right);
}
我已經一遍又一遍地用10個隨機值嘗試這種代碼,它工作的大部分時間。有些情況下它不起作用,我試圖找出什麼時候。
時它不工作的一個例子是當值是:160,151,159,112,如圖7所示,121,105,48,186
解決它。刪除了很多代碼,使它更簡單,但至少可以工作。 甚至不知道如果u可以稱之爲快速搜索了,但這裏是最後的版本:
void quickSort(int unsorted[], int left, int right)
{
int i = left,
j = right;
int pivot = right;
do
{
while (unsorted[i] < unsorted[pivot])
i++;
while (unsorted[j] > unsorted[pivot])
j--;
if (unsorted[i] >= unsorted[j] && i <= j)
{
swap(unsorted[i], unsorted[j]);
i++;
j--;
}
} while (i < j);
if (left < j)
quickSort(unsorted, left, j);
if (i < right)
quickSort(unsorted, i, right);
}
除了極少數的邊緣案例(如果您有足夠的關於容器佈局的信息,選擇特定的算法會給您帶來巨大的性能優勢),您不需要知道正在使用哪種特定的排序算法。只需寫入std :: sort(unsorted,unsorted + 100);並繼續前進。 – 2011-03-31 14:01:28
您是否嘗試使用調試器和更小的陣列? – 2011-03-31 14:02:11
注意,像'right = pivot,quickSort(unsorted,left,right)'這樣的行是不好的風格和混淆。幸運的是,賦值比逗號運算符具有更高的優先級,所以它按照您希望的方式工作。改爲將它寫在兩行上。 – 2011-03-31 14:18:39