问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

菜鸟提问 c语言关于快速排序

发布网友 发布时间:2022-04-30 14:10

我来回答

4个回答

热心网友 时间:2022-05-22 02:50

其实,最想说明的是那段交换的代码
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
一定要排除 i==j 的情况。即自己与自己交换的情况。
如:
a=9;
a^=a;/*a=0*/
a^=a;/*a=0*/
a^=a;/*a=0*/
a就不再是10了。

#include<stdio.h>
#include<stdlib.h>
void quicksort(int R[],int s,int t)
{
int i,j;
int temp;
if(s<t)
{
temp=R[s];/*选第一个数作为参照*/
/*while(i!=j)不要用这种方法判定循环结束,万一i==j-1,i++,j--后 i〉j了,!=这个条件就救不了你了*/
for(i=s+1,j=t;i<=j;i++,j--)/*不包括参照数,进行左右阵营站队*/
{
while(j>i && R[j]>=temp)/*R[j]>=temp不要 = 也行,加了更好,毕竟相等的无论站左站右,哪边都无所谓*/
j--;
while(i<j && R[i]<=temp)
i++;
if(i!=j){/*i千万不能等于j*/
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
}
}
i--;
if(R[s]<R[i])i--;/*调整i的值,使i指向最后一个小于等于参照数的位置*/
/*将参照数 与 最后一个小于等于参照数的数进行交换,这样就真正把左右两个阵营分开了*/
R[s]=R[i];
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);
}
}
int main(void)
{
int i;
int a[]={5,3,2,1,9,8,7,4,5};
quicksort(a,0,sizeof(a)/sizeof(int)-1);
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d ",*(a+i));
return 0;
}

热心网友 时间:2022-05-22 04:08

R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
你的代码里面R[i]^,R[j]^从何而来?不理解,不好改。
快速排序作为c语言中速度最快的一种排序,肯定能处理数字相同的情况,而且快速排序肯定是用递归算法。你的问题是算法,这里有个带注释的快速排序,win-tc和Dev-c++下运行通过。
#include <stdio.h>
#include <conio.h>
#define MAX 255
int R[MAX];

int Partition(int i,int j)
{/* 调用Partition(low,high)时,对R[low..high]做划分,*/
/* 并返回基准记录的位置 */
int pivot=R[i]; /* 用区间的第1个记录作为基准 */
while(i<j)
{ /* 从区间两端交替向中间扫描,直至i=j为止 */
while(i<j&&R[j]>=pivot) /* pivot相当于在位置i上 */
j--; /* 从右向左扫描,查找第1个关键字小于pivot.key的记录R[j] */
if(i<j) /* 表示找到的R[j]的关键字<pivot.key */
R[i++]=R[j]; /* 相当于交换R[i]和R[j],交换后i指针加1 */
while(i<j&&R[i]<=pivot) /* pivot相当于在位置j上*/
i++; /* 从左向右扫描,查找第1个关键字大于pivot.key的记录R[i] */
if(i<j) /* 表示找到了R[i],使R[i].key>pivot.key */
R[j--]=R[i]; /* 相当于交换R[i]和R[j],交换后j指针减1 */
}
R[i]=pivot; /* 基准记录已被最后定位*/
return i;
}

void Quick_Sort(int low,int high) /* 对R[low..high]快速排序 */
{ int pivotpos; /* 划分后的基准记录的位置 */
if(low<high)
{/* 仅当区间长度大于1时才须排序 */
pivotpos=Partition(low,high); /* 对R[low..high]做划分 */
Quick_Sort(low,pivotpos-1); /* 对左区间递归排序 */
Quick_Sort(pivotpos+1,high); /* 对右区间递归排序 */
}
}

main()
{int i,n;
clrscr();
puts("Please input total element number of the sequence:");
scanf("%d",&n);
if(n<=0||n>MAX)
{ printf("n must more than 0 and less than %d.\n",MAX);
exit(0);
}
puts("Please input the elements one by one:");
for(i=1;i<=n;i++)
scanf("%d",&R[i]);
puts("The sequence you input is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
Quick_Sort(1,n);
puts("\nThe sequence after quick_sort is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
puts("\n Press any key to quit...");
getch();
}

热心网友 时间:2022-05-22 05:43

#include<stdio.h>
#include<stdlib.h>

void swap(int &a,int &b){ //交换两个数
int temp=a;
a=b;
b=temp;
}
void quicksort(int R[],int s,int t)
{
int i=s,j=t;
int temp;
if(s<t)
{
temp=R[s];
while(i<j) //while(i!=j)
{
while(j>i && R[j]>=temp) //改成等号
j--;
while(i<j && R[i]<=temp)
i++;
swap(R[i],R[j]); //交换,你是想交换吧,虽然可以通过异或交换,但难以理解.
}
R[s]=R[i]; //增加的,交换中间数和第一个数
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);
}
}
int main()
{
int i;
int a[]={5,3,2,1,9,8,7,4,5};
int n = sizeof(a)/sizeof(int);
quicksort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
// system("pause");
return 1;
}

热心网友 时间:2022-05-22 07:34

R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];

就是交换R[i]和R[j]
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
初二选辅导书,新教材完全解读、中学教材全解和点拨哪个好 ...N系,还有三星、索尼、飞利浦,哪个MP3的音质最好 白本的近义词 白铜怎么造句 cc sc区别 ...都是怎么保存的?为什么越久越香,还不会变质? 我和女孩认识将近20天了,女孩只让我拉手,但得不到别的进展,求助? 对女的再怎么欲擒故纵,她也仍旧泰然自若,为什么?不爱还是心里强大? 女人只要沉住_,就_有什_你得不到的 如何关掉电脑低音炮 C语言数据结构---快速排序的问题 用c语言编写函数QuickSort()来实现快速排序 c语言 快排 C语言程序快速排序 求C语言快速排序程序 C语言 快排代码? 360极速浏览器如何去掉百度搜索栏,如下图。 消毒柜是臭氧消毒好还是巴氏消毒好?紫外线和红外线有区别吗? 消毒柜红外线和紫外线那种消毒方式比较好 美容院里面买消毒柜是红外线好还是紫外线的好,哪个消毒干净些 远红外线与紫外线消毒哪个好 怎么辨别紫外线和红外线 紫外线与红外线的区别? 请列表说明红外线和紫外线的异同点以及各自应用。物理 红外线和紫外线的区别和应用分别是什么? 红外线与紫外线的具体区别在哪儿 红外线杀毒与紫外线杀毒有什么不同呢 网络就是宽带吗。网络就是宽带吗? 宽带是什么网络 4g是什么意思 宽带什么意思&#xFFFC;? C语言快排问题 如何利用C语言中的qsort库函数实现快速排序 网易版“我的世界”局域网联机存档怎么转移? 网易我的世界 我把存档移动到另一个手机另一个账户上面 我朋友用同样的账号装备还在吗? 汤圆的热量偏高,那一般情况下吃几个比较合适呢? 正常女生一顿吃几个汤圆? 汤圆吃多少个 元宵节汤圆为什么要吃7个? 汤圆吃几个 大家正常来说一次能吃多少个汤圆 弱弱的问一句.销售的是不是都要穿正装上班的 吃汤圆最多要吃几个? 做销售是不是必须穿正装 汤圆一顿吃几个好 汽车销售员是不是一定要穿西装? 早餐吃几个汤圆 保险公司的销售是不是都穿西服 做房地产销售 需要一直穿正装吗 销售类实习面试,需要穿正装吗? 做汽车销售要穿西服吗?
  • 焦点

最新推荐

猜你喜欢

热门推荐