鱼C论坛

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

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

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

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

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

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

using namespace std;

void swap(int* arr, int a, int b)
{
  int temp = arr[a];
  arr[a] = arr[b];
  arr[b] = temp;
}

int partition(int* arr, int l, int r)
{
  int less = l - 1;
  int more = r;
  while(l < more)
  {
    if(arr[l] <= arr[r])
      swap(arr, ++less, l++);
    else
      swap(arr, --more, l);
  }
    swap(arr, less+1, r);
    int j = less + 1;
    return j;

}

void quickSort(int *arr, int l, int r)
{
  if(r - l < 1)
    return;
  if(l < r) //递归的条件很重要
  {
    srand(int (time(0)));
    swap(arr, l+int(rand()%10*0.1*(r-l+1)), r);
    int p = partition(arr, l, r);
    quickSort(arr, l, p);
    quickSort(arr, p+1, r);
  }
}

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

  for(int i = 0; i < 7; i++)
    cout << array[i] <<" ";
  cout <<endl;
  return 0;
}
最佳答案
2019-5-20 17:26:39
你的问题是快排根本就写错了。快排的轴值分割后是不参与二次排序的。而你的代码
    quickSort(arr, l, p);
    quickSort(arr, p+1, r);
把轴值也拉进去参与二次排序,
那么轴值刚好就是最大的值呢?那么你此时
p==r,
quickSort(arr,l,p);
就成了
    quickSort(arr, l, r);

那你这根本就是个死循环了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 00:10:58 | 显示全部楼层
void quickSort(int *arr, int l, int r)
{
  if(r - l < 1)
    return;
  if(l < r) //递归的条件很重要
  {
    srand(int (time(0)));
    swap(arr, l+int(rand()%10*0.1*(r-l+1)), r);
    int p = partition(arr, l, r);
    quickSort(arr, l, p);
    quickSort(arr, p+1, r);
  }
}

你这是要干嘛?
排序还需要srand和rand  ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个地方是想随机选择比较的那个数,也可以不用。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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的吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 17:26:39 | 显示全部楼层    本楼为最佳答案   
你的问题是快排根本就写错了。快排的轴值分割后是不参与二次排序的。而你的代码
    quickSort(arr, l, p);
    quickSort(arr, p+1, r);
把轴值也拉进去参与二次排序,
那么轴值刚好就是最大的值呢?那么你此时
p==r,
quickSort(arr,l,p);
就成了
    quickSort(arr, l, r);

那你这根本就是个死循环了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 17:28:46 | 显示全部楼层
改的话要把轴值剔出来
    quickSort(arr, l, p-1);
    quickSort(arr, p+1, r);
另外。。我建议你还是使用左闭右开区间。。这左闭右闭区间一会多1一会少1,情况一复杂真的糟心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,我这里理解有问题,非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,你是正确的,我也不知道中午是怎么回事,我就把l和less弄混了
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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