码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序算法昨晚实现了,,,,但是有个BUG

时间:2014-10-11 17:44:15      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   ar   for   sp   div   art   问题   

昨天晚上写好了归并排序的算法,后来就趁热打铁,开始写快速排序算法,代码是越写越熟练,越写越来劲。昨天晚上也就写出来了快速排序算法。

但是在我测试的时候先后出现一些问题:

第一个问题:

1)输入 1 2 3 4 5 6 7  -1时,排序结果2 1 5 6 7 3什么什么的,但是输入8 7 6 5 4 3 2 1 -1时,倒是能排得好好的。天哪,脑袋记不清了,,,我竟然忘了我修改那个地方了,,,真是悲催。我把它修改好了。(应该是修改了,分成两段的过程中,数组小标大小的限时,之前应该没有加左边的下标小于右边的下标)

while(array[n1]<array[p]&&n1<=n2)
	n1++;
while(array[n2]>array[p]&&n2>=n1)
	n2--; 

现在好了,不管输入1 2 3 还是 3 2 1 还是2 3 1等,都能很对得输出。其实还有个bug,我先上代码,然后接着写。

#include<iostream>
using namespace std;

int vector_initial(int *array);
void vector_print(int *array,int n);
void fast_sort(int *array,int p,int r);
int separate_2part(int *array,int p,int r);

int main()
{
	int a[100];
	int n;

	n=vector_initial(a);
	fast_sort(a,0,n);
	vector_print(a,n);
	return 0;
}

int vector_initial(int *array)
{	int i=0;
	cin>>array[i];
	while(array[i]!=-1)
	{
		i++;
		cin>>array[i];
	}
	return i-1;
}
void vector_print(int *array,int n)
{
	if(array[0]==-1)
		return;
	for(int i=0;i<=n-1;i++)
		cout<<array[i]<<" ";
	cout<<array[n]<<endl;
}

void fast_sort(int *array,int p,int r)
{
	int v,tempdata;
	if(r>p)
	{
		v=separate_2part(array,p,r);
		fast_sort(array,p,v-1);
		fast_sort(array,v+1,r);
	}
	
}

int separate_2part(int *array,int p,int r)
{	
	int n1,n2,tempdata;
	n1=p;
	n2=r;
	while(n2>n1)
	{
		while(array[n1]<array[p]&&n1<=n2)
			n1++;
		while(array[n2]>array[p]&&n2>=n1)
			n2--;
		if(n1!=n2)
		{
			tempdata=array[n1];
			array[n1]=array[n2];
			array[n2]=tempdata;
		}
		else
		{
			tempdata=array[p];
			for(int i=p+1;i<=n1;i++)
			{
				array[i-1]=array[i];
			}
			array[n1]=tempdata;
		}
	}
	return n2;
}

  现在的问题是:

不能输入两个相同的数,一旦输入的数组中,有两个或多个相同时,程序就进入死循环。我昨晚调试了,单步跟踪到

int separate_2part(int *array,int p,int r)这个函数里,在下面这个循环里出不来了:
	while(n2>n1)
	{
		while(array[n1]<array[p]&&n1<=n2)
			n1++;
		while(array[n2]>array[p]&&n2>=n1)
			n2--;
		if(n1!=n2)
		{
			tempdata=array[n1];
			array[n1]=array[n2];
			array[n2]=tempdata;
		}
		else
		{
			tempdata=array[p];
			for(int i=p+1;i<=n1;i++)
			{
				array[i-1]=array[i];
			}
			array[n1]=tempdata;
		}
	}

  最后,始终是~~~~~始终是~是n2比n1大,我忘了到底是大1还是大2了,,我先把代码贴上,我写会儿作业,晚上接着搞!



快速排序算法昨晚实现了,,,,但是有个BUG

标签:blog   io   os   ar   for   sp   div   art   问题   

原文地址:http://www.cnblogs.com/liutianyi10/p/4019140.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!