鱼C论坛

 找回密码
 立即注册
查看: 2243|回复: 8

[已解决]C++ 快速排序

[复制链接]
发表于 2019-5-20 00:04:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自己写了一个C++的快排,有的时候程序能够正常执行,排序正确。有的时候程序不能执行。编译都没有问题,不能执行时返回的是, Process returned -1073741571(0xc00000FD)。请求大神帮忙看看是不是程序写得哪有问题。
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>

  4. using namespace std;

  5. void swap(int* arr, int a, int b)
  6. {
  7.   int temp = arr[a];
  8.   arr[a] = arr[b];
  9.   arr[b] = temp;
  10. }

  11. int partition(int* arr, int l, int r)
  12. {
  13.   int less = l - 1;
  14.   int more = r;
  15.   while(l < more)
  16.   {
  17.     if(arr[l] <= arr[r])
  18.       swap(arr, ++less, l++);
  19.     else
  20.       swap(arr, --more, l);
  21.   }
  22.     swap(arr, less+1, r);
  23.     int j = less + 1;
  24.     return j;

  25. }

  26. void quickSort(int *arr, int l, int r)
  27. {
  28.   if(r - l < 1)
  29.     return;
  30.   if(l < r) //递归的条件很重要
  31.   {
  32.     srand(int (time(0)));
  33.     swap(arr, l+int(rand()%10*0.1*(r-l+1)), r);
  34.     int p = partition(arr, l, r);
  35.     quickSort(arr, l, p);
  36.     quickSort(arr, p+1, r);
  37.   }
  38. }

  39. int main()
  40. {
  41.   int array[] = {1,4,6,8,2,3,5};
  42.   quickSort(array, 0, 6);

  43.   for(int i = 0; i < 7; i++)
  44.     cout << array[i] <<" ";
  45.   cout <<endl;
  46.   return 0;
  47. }
复制代码
最佳答案
2019-5-20 17:26:39
你的问题是快排根本就写错了。快排的轴值分割后是不参与二次排序的。而你的代码
  1.     quickSort(arr, l, p);
  2.     quickSort(arr, p+1, r);
复制代码

把轴值也拉进去参与二次排序,
那么轴值刚好就是最大的值呢?那么你此时
p==r,
  1. quickSort(arr,l,p);
复制代码
就成了
  1.     quickSort(arr, l, r);
复制代码

那你这根本就是个死循环了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 00:10:58 | 显示全部楼层
  1. void quickSort(int *arr, int l, int r)
  2. {
  3.   if(r - l < 1)
  4.     return;
  5.   if(l < r) //递归的条件很重要
  6.   {
  7.     srand(int (time(0)));
  8.     swap(arr, l+int(rand()%10*0.1*(r-l+1)), r);
  9.     int p = partition(arr, l, r);
  10.     quickSort(arr, l, p);
  11.     quickSort(arr, p+1, r);
  12.   }
  13. }
复制代码


你这是要干嘛?
排序还需要srand和rand  ?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 02:44:50 | 显示全部楼层
人造人 发表于 2019-5-20 00:10
你这是要干嘛?
排序还需要srand和rand  ?

这个地方是想随机选择比较的那个数,也可以不用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 13:46:54 | 显示全部楼层
清启牧 发表于 2019-5-20 02:44
这个地方是想随机选择比较的那个数,也可以不用。

看这样一种情况
在main函数中调用quickSort函数传递的参数 l = 0,r = 6
在quickSort函数中调用partition函数时把 l = 0,r = 6 传给了partition
在partition函数中less = l - 1
因为l = 0,所以less = -1

第20行if(arr[l] <= arr[r])
也就是if(arr[-1] <= arr[r])
对数组arr使用了索引 -1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 17:00:32 | 显示全部楼层
人造人 发表于 2019-5-20 13:46
看这样一种情况
在main函数中调用quickSort函数传递的参数 l = 0,r = 6
在quickSort函数中调用partiti ...

唔,l是0呐,less才有可能是-1,arr[l]不会索引到-1的吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 17:26:39 | 显示全部楼层    本楼为最佳答案   
你的问题是快排根本就写错了。快排的轴值分割后是不参与二次排序的。而你的代码
  1.     quickSort(arr, l, p);
  2.     quickSort(arr, p+1, r);
复制代码

把轴值也拉进去参与二次排序,
那么轴值刚好就是最大的值呢?那么你此时
p==r,
  1. quickSort(arr,l,p);
复制代码
就成了
  1.     quickSort(arr, l, r);
复制代码

那你这根本就是个死循环了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 17:28:46 | 显示全部楼层
改的话要把轴值剔出来
  1.     quickSort(arr, l, p-1);
  2.     quickSort(arr, p+1, r);
复制代码

另外。。我建议你还是使用左闭右开区间。。这左闭右闭区间一会多1一会少1,情况一复杂真的糟心
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 19:49:41 | 显示全部楼层
Croper 发表于 2019-5-20 17:26
你的问题是快排根本就写错了。快排的轴值分割后是不参与二次排序的。而你的代码
把轴值也拉进去参与二次排 ...

是的,我这里理解有问题,非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 22:02:20 | 显示全部楼层
清启牧 发表于 2019-5-20 17:00
唔,l是0呐,less才有可能是-1,arr[l]不会索引到-1的吧?

嗯,你是正确的,我也不知道中午是怎么回事,我就把l和less弄混了
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 11:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表