一个快速排序的问题

夜色lion 2009-03-21 11:54:44
各位~!
看下小弟的这个快速排序的算法,总是有问题,但是不知道出在哪~!
void Change(int& m, int& n)
{
int mid;
mid = m;
m = n;
n = mid;
}

int Compare(int a[], int min, int max) //比较函数,发现第i个数字比 第一个小,第j个数字比第一个大,若发现则交换,到最后若没有的话,直接交换j和第 一个数字
{
int i = min + 1;
int j = max;
while(i < j)
{
while(a[min] > a[i])
{
if(i < max) //防止越界
i++;
}
while(a[min] < a[j])
{
if(j > min)
j--;
}
if(i < j)
Change(a[i], a[j]);
if(i == max || j == min)
break;
else
{
i++;
j--;
}
}
Change(a[min],a[j]);
return j;
}

void QuickSort(int a[], int min, int max)
{
if(min < max)
{
int m = Compare(a, min, max);
QuickSort(a, min, m - 1);
QuickSort(a, m + 1, max);
}
}

想了很久,实在没发现有什么错的,小弟猜要是有错的话,应该是越界问题,但是我都已经防止了,所以。。。。。郁闷很久了~!
望各位大哥可以给小弟只出错在哪~!
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
1900_in_bj 2009-03-22
  • 打赏
  • 举报
回复
用如下参数测试:
int a[]={30,20,10}
int min = 0,max = 2;
QuickSort(a,min,max);

楼主单步跟踪一下就会发现问题所在了。

while(a[min] > a[i])
{
if(i < max) //防止越界
i++;
}
死循环了。
baihacker 2009-03-22
  • 打赏
  • 举报
回复

//常用的几种实现,你参考一下

void QSort(int in[], int l, int r)
{
while (l<r)
{
int p = in[l], i = l, j = r + 1,t;
do{
while(--j,in[j]>p);
while(++i,in[i]<p);
if (i<j) t=in[i],in[i]=in[j],in[j]=t;
}while(i<j);
in[l]=in[j],in[j]=p;
QSort(in, l, j-1);
l=j+1;
}
}

void QSort(int a[],int l,int r)
{
while (l < r)
{
int i = l - 1, p = a[r], t;
for (int j = l; j < r; ++j)
(a[j]<=p)&&(++i,t=a[i],a[i]=a[j],a[j]=t);
(++i,t=a[i],a[i]=a[j],a[j]=t);
QSort(a, l, i-1);
l = i + 1;
}
}

void QSort(int in[],int l,int r)
{
while (l<r)
{
int i=l, j=r, temp=in[i];
while(i<j)
{
while((in[j]>temp)&&(j>i)) --j;
if(j>i) in[i++]=in[j];
while((in[i] <=temp)&&(j>i)) ++i;
if(i<j) in[j--]=in[i];
}
in[i]=temp;
QSort(in, l, i-1);
l = i+1;
}
}
baidublog 2009-03-22
  • 打赏
  • 举报
回复
downmooner 2009-03-22
  • 打赏
  • 举报
回复
PARTITION(A, p, r)
1 x ← A[r]
2 i ← p - 1
3 for j ← p to r - 1
4 do if A[j] ≤ x
5 then i ← i + 1
6 exchange A[i] ↔ A[j]
7 exchange A[i + 1] ↔ A[r]
8 return i + 1
jackzhhuang 2009-03-22
  • 打赏
  • 举报
回复
照着算法导论的思路写一个,很简单的。
Coder-zhw 2009-03-22
  • 打赏
  • 举报
回复
这是本人前几天写的冒泡排序的程序
能用的各位看看

#include<iostream>
using namespace std;
int n;
void main()
{
cout<<"请输入要排序的数的个数n=";
cin>>n;
int*a = new int[n]; //定义动态数组
cout<<"请输入 "<<n<<"个未排序的数."<<endl;
for(int k=0;k<n;k++)
cin>>a[k]; //输入n个要排序的数
cout<<endl<<"你输入的数是"<<endl;
for(int m=0;m<n;m++)
cout<<a[m]<<" "; //输出这n个数
cout<<endl;
for(int i=0;i<n;i++)
{
for(int j=n-1;j>0;j--)
{
if(a[j]<a[j-1]) //交换顺序
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}cout<<"排序数为"<<endl;
for( i=0;i<n;i++) //输出已排序的数
cout<<a[i]<<" ";
cout<<endl;
delete[]a;


}
夜色lion 2009-03-22
  • 打赏
  • 举报
回复
为什么这样不会产生死循环?
int a[9];
for(int i = 0; i < 9; i++)
a[i] = i;
int j = 0;
while(a[9] > a[j])
{
cout<<j;
j++;
}

再DEVC,vc6.0 下面测试竟然不会是死循环~!
这也写是不是很危险?当i超过8的时候得到的是随机数~!
只有当随机数比a【9】大的时候才是正确的吧?
hiyoung 2009-03-22
  • 打赏
  • 举报
回复
学习,接分
aaaa3105563 2009-03-22
  • 打赏
  • 举报
回复
学习··

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧