大家帮忙看一下是啥问题

stack009 2014-04-29 10:51:54
这是我看数据结构时实现的快速排序算法,但是结果总不对

#include<stdlib.h>
#include<stdio.h>
int a[100]={0},n;
int quicksort(int left,int right)
{
int i,j,temp,t;
if(left > right)
return 0;
temp = a[left];//存储基准数
i = left;
j = right;
while(i != j)
{
//必须先从右边开始查找,否则基准数交换的会是一个大于基准数的值
while(a[j] >= a[temp] && i < j)
j--;
while(a[i] <= a[temp] && i < j)
i++;
if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
int i,j,k;
printf("请输入数据长度:\n");
scanf("%d\n",&n);
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
quicksort(0,n-1);
for(i = 0;i < n;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
...全文
251 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
707wk 2014-05-02
  • 打赏
  • 举报
回复
碰巧在 编程珠玑 上看过快速排序,但书里的代码少了个 = ,会死循环。。。
stack009 2014-04-30
  • 打赏
  • 举报
回复
引用 14 楼 Automation_dmu 的回复:
方便你理解:
template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	/*last为当前key值得位置,key为a[left]*/
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
	/*遍历数组,将小于key放到一边,将大于key的放到另一边,并记录key的最后位置*/
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	/* 
	   设x表示小于key的值, y表示大于key的值
	   则当前数组变成  key x x x x x y y y y y y
	   last此时值为最后一个x的位置。
	*/
	swap<T>(a[left], a[last]);
	/*
	   交换key和a[last]数组变成  x x x x x key y y y y y y
	*/

	/* 分治处理 x x x x x 和 y y y y y y */
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
嗷,谢谢啊,我的思想被书上的算法先入为主了,一时没看出来
AndyStevens 2014-04-30
  • 打赏
  • 举报
回复
方便你理解:
template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	/*last为当前key值得位置,key为a[left]*/
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
	/*遍历数组,将小于key放到一边,将大于key的放到另一边,并记录key的最后位置*/
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	/* 
	   设x表示小于key的值, y表示大于key的值
	   则当前数组变成  key x x x x x y y y y y y
	   last此时值为最后一个x的位置。
	*/
	swap<T>(a[left], a[last]);
	/*
	   交换key和a[last]数组变成  x x x x x key y y y y y y
	*/

	/* 分治处理 x x x x x 和 y y y y y y */
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
AndyStevens 2014-04-30
  • 打赏
  • 举报
回复
引用 11 楼 stack009 的回复:
[quote=引用 9 楼 Automation_dmu 的回复:] [quote=引用 7 楼 stack009 的回复:] 你确定你这个是快速排序而不是冒泡??
如假包换~参见《算法导论》快速排序章节[/quote] 可我怎么都没看出分治的思想在哪里啊[/quote]
swap<T>(a[left], a[last]);    
 qsort<T>(a, left, last-1);    
 qsort<T>(a,last+1, right); 
这里的last是指遍历之后key的位置,左边为<key , 右边为>key
shlvshe00 2014-04-30
  • 打赏
  • 举报
回复
#include<stdlib.h>
#include<stdio.h>
int a[100]={0},n;
int quicksort(int left,int right)
{
	int i,j,temp,t;
	if(left > right)
		return 0;
	temp = a[left];//存储基准数
	i = left;
	j = right;
	while(i != j)
	{
		//必须先从右边开始查找,否则基准数交换的会是一个大于基准数的值  
		while(a[j] >= temp && i < j)
			j--;
		while(a[i] <= temp && i < j)
			i++;
		if(i < j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		} 
	}
	a[left] = a[i];
	a[i] = temp;
	quicksort(left,i-1);
	quicksort(i+1,right); 
}
int main()
{
	int i,j,k;
	printf("请输入数据长度:\n");
	scanf("%d\n",&n);
	for(i = 0;i < n;i++)
		scanf("%d",&a[i]);
	quicksort(0,n-1);
	for(i = 0;i < n;i++)
		printf("%d ",a[i]);
	printf("\n");
	system("pause");
	return 0; 
} 
stack009 2014-04-30
  • 打赏
  • 举报
回复
引用 9 楼 Automation_dmu 的回复:
[quote=引用 7 楼 stack009 的回复:] [quote=引用 6 楼 Automation_dmu 的回复:] 参照以下实现:
template<class T>
void swap(T& a, T &b)
{	
	T temp = a;
	a = b;
	b = temp;
}

template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	swap<T>(a[left], a[last]);
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
你确定你这个是快速排序而不是冒泡??[/quote] 如假包换~参见《算法导论》快速排序章节[/quote] 可我怎么都没看出分治的思想在哪里啊
stack009 2014-04-30
  • 打赏
  • 举报
回复
我靠,今天加了几个变量看了一下是两个while循环的控制语句写错了,应该是temp而不是a[temp],唉,每次都是这些问题,又来送分了,擦
AndyStevens 2014-04-30
  • 打赏
  • 举报
回复
引用 7 楼 stack009 的回复:
[quote=引用 6 楼 Automation_dmu 的回复:] 参照以下实现:
template<class T>
void swap(T& a, T &b)
{	
	T temp = a;
	a = b;
	b = temp;
}

template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	swap<T>(a[left], a[last]);
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
你确定你这个是快速排序而不是冒泡??[/quote] 如假包换~参见《算法导论》快速排序章节
buyong 2014-04-30
  • 打赏
  • 举报
回复
自己加断点调试吧
stack009 2014-04-30
  • 打赏
  • 举报
回复
引用 6 楼 Automation_dmu 的回复:
参照以下实现:
template<class T>
void swap(T& a, T &b)
{	
	T temp = a;
	a = b;
	b = temp;
}

template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	swap<T>(a[left], a[last]);
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
你确定你这个是快速排序而不是冒泡??
AndyStevens 2014-04-30
  • 打赏
  • 举报
回复
参照以下实现:
template<class T>
void swap(T& a, T &b)
{	
	T temp = a;
	a = b;
	b = temp;
}

template <class T>
void qsort(T* a, int left, int right)
{
	if(a == NULL ||  left <0 || right<0)return;
	if(left >= right)return;
	
	int last = left;
	for(int i=left+1;i<=right;i++)
	{
		if(a[i]<a[left])
			swap<T>(a[i],a[++last]);
	}
	swap<T>(a[left], a[last]);
	qsort<T>(a, left, last-1);
	qsort<T>(a,last+1, right);
	
}
stack009 2014-04-30
  • 打赏
  • 举报
回复
没人来领分么,Ctrl+c Ctrl+v就能拿分了啊
只此冒泡君 2014-04-30
  • 打赏
  • 举报
回复
lz 你這程序 根本就不是快速排序的思想!
stack009 2014-04-29
  • 打赏
  • 举报
回复
我对照了一下原型,还是觉得没写错啊
赵4老师 2014-04-29
  • 打赏
  • 举报
回复
引用 2 楼 stack009 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c
我在LINUX下编译的啊,我感觉函数功能应该没写错啊[/quote] Linux下你也可以找qsort函数对应的源代码。
stack009 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c
我在LINUX下编译的啊,我感觉函数功能应该没写错啊
赵4老师 2014-04-29
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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