[英]QuickSort code doesn't work properly
int main()
{
int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;
cout << "Numbers are: " << endl;
for (int i = 0; i < size; i++)
{
cout << numbers[i] << "\t";
}
finish = 10;
start = 0;
quickSort(numbers, start, finish);
cout << "\n\nSorted: " << endl;
for (int j = 0; j < size; j++)
{
cout << numbers[j] << "\t";
}
return 0;
}
int Partition(int numbers[], int start, int finish)
{
int pole = start;
int pivot = numbers[finish];
for (int k = 0; k < finish - 1; k++)
{
if (numbers[k] <= pivot)
{
int temp = numbers[k];
numbers[k] = numbers[pole];
numbers[pole] = temp;
pole++;
}
}
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
return pole;
}
void quickSort(int numbers[], int start, int finish)
{
int marker;
if (start < finish)
{
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
}
}
我觉得我想念什么,但我不知道是什么。 程序排序不正确。 需要一些帮助! 据我了解,我试图指出过程中的问题所在,但问题并未完全解决。 好吧,我不确定自己。 我还是递归的新手,所以我可能做错了什么。
代替
finish = 10;
你应该写
finish = size;
在分区函数中,您编写了
int pivot = numbers[finish];
这读取超出了数组的末尾。 你的意思是
int pivot = numbers[finish - 1];
在分区函数中,您将运行如下循环:
for (int k = 0; k < finish - 1; k++)
从整个数组的开头开始。 它应该是:
for (int k = start; k < finish - 1; k++)
分区功能的最后一步是错误的:
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
它使用枢轴值而不是枢轴索引。 它应该是:
int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;
quickSort
的实现也是错误的:
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
应该:
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);
上述更改可修复您的代码。
从根本上来说,我认为您需要更加清楚start
和finish
含义。 它们遵循以下约定: start
是第一项的索引, finish
比最后一项的索引大。 由于未完全理解该约定,因此上述许多错误归因于一对一错误。
int main(){
int numbers[] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5};
const int size = sizeof(numbers)/sizeof(int);
cout << "Numbers are: " << endl;
for (int i = 0; i < size; i++){
cout << numbers[i] << "\t";
}
quickSort(numbers, 0, size - 1);//This is the first place you should take care of!
//What do you want the third parameter represent?
//1.the greatest index of the array;or 2. the length of the array
//Here goes the first choose, so size-1
cout << "Sorted: " << endl;
for (int j = 0; j < size; j++){
cout << numbers[j] << "\t";
}
return 0;
}
int Partition(int num[], int start, int finish){
int temp;
int pole = start;
int pivot = num[finish];
for (int k = start; k <= finish - 1; k++){//as I mentioned above, choose 1 , so there must be =
if (num[k] <= pivot){
temp = num[k];
num[k] = num[pole];
num[pole] = temp;
pole++;
}
}
temp = num[pole];
num[pole] = num[finish];//you did something wrong here!!
num[finish] = temp;//And here.Not pivot.
return pole;
}
void quickSort(int num[], int start, int finish){
int marker;
if (start < finish){
marker = Partition(num, start, finish);
quickSort(num, start, marker - 1);//And here, num[marker] is in its final place,so ending with marker-1 will be fine.
//Of course, you also can replace it with marker.
quickSort(num, marker + 1, finish);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.