您的位置:首页 > 其它

快排实现时候的一个逻辑错误

2016-01-11 17:02 253 查看
 

#include"header_file.h"
using namespace std;

void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}

void quick_sort(int a[],int low,int high)
{

if(low>=high)
return;

int first;
int last;
first=low;
last=high;

int x;
x=a[low];

while(low<high)
{
while(low<high&&a[high]>=x)
{
high--;
}
swap(a[low],a[high]);

cout<<i<<"      "<<low<<" low"<<"  "<<high<<endl;

while(low<high&&a[low]<=x)
{
low++;
}
swap(a[high],a[low]);
cout<<i<<"      "<<low<<" high"<<"  "<<high<<endl;
}
if(first<low-1)
quick_sort(a,first,low-1);
if(last>low+1)
quick_sort(a,low+1,last);
}

int main(void)
{
int a[7]={4,3,6,7,2,1,5};
quick_sort(a,0, sizeof(a) / sizeof(a[0]) - 1);

cout<<"test"<<endl;
for(int i=0;i<7;i++)
cout<<a[i]<<" ";
}


执行程序会发现在算法排序的地方无限循环,想了半天才知道是33和41行的位置,不管while循环是否执行都会执行swap语句。逻辑错误!

只能换种方法,改成大家最常见的那种就好了

void quick_sort(int a[],int low,int high)
{

if(low>=high)
return;

int first;
int last;
first=low;
last=high;

int x;
x=a[low];

while(low<high)
{
while(low<high&&a[high]>=x)
{
high--;
}
a[low]=a[high];

//    cout<<i<<"      "<<low<<" low"<<"  "<<high<<endl;

while(low<high&&a[low]<=x)
{
low++;
}
a[high]=a[low];
//    swap(a[high],a[low]);
//    cout<<i<<"      "<<low<<" high"<<"  "<<high<<endl;
}
a[low]=x;

if(first<low-1)
quick_sort(a,first,low-1);
if(last>low+1)
quick_sort(a,low+1,last);
}


这里就不是交换了,直接赋值,然后最后给a[low]赋值。

很低级的错误

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: