我试过了一堆不同的方法来写这个,但大多数时候我陷入了一个无限循环。 这个版本的代码根本没有排序,我不知道问题是什么。需要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