c++的快速排序

这段代码应该是对的。。。但是有个问题去掉第36行的if或者41行都会出现错误,但是我想不到为什么会这样,请帮忙解答另外,dowhile语句里的=号能去掉吗?还有两个whi... 这段代码应该是对的。。。但是有个问题去掉第36行的if 或者 41行都会出现错误,但是我想不到为什么会这样,请帮忙解答另外,dowhile语句里的=号能去掉吗?还有两个while里能加=号吗? 展开
 我来答
妖孽缘嵇
2019-04-06
知道答主
回答量:5
采纳率:0%
帮助的人:9917
展开全部

这段代码是使用do...while语句设计外层循环,条件为i小于j(及i为左侧下标,j为右侧下标),表示如果两边的下标交错就停止循环,内层的两个循环分别用来比较中间值两侧数组元素,当左侧元素的数值小于中间值时,取下一个元素与中间值进行比较,否则退出第一个内层循环;当右侧数值大于中间值时,取前一个元素与中间值进行比较,否则推出第二个内层循环;然后判断i的值是否小于等于j,(这行不能删哈,因为你输入进来的值可能j比i大的,这里得判断一下再执行),如果是,则交换以i和j为下标的两个元素值,继续外层循环。当外层循环结束后,以数组第一个元素到以j为下标的元素为参数递归调用该函数(递归知道叭,就是不断重复调用该函数,不过递归函数要知道两个条件,结束条件与递推关系),同时,以i为下标的数组元素到数组元素到数组最后一个参数也作为参数递归调用该函数。依此类推,知道将数组元素按照从小到大的顺序重新排列为止。(while里的=号不能去哦,不然当a[i]a[j]都等于中间值的时候,后面代码会出现问题的)

这是折半法排序,我就劳烦自己敲段代码给你

#include<stdio.h>
//声明函数 
void CelerityRun(int left,int right,int array[]);
int main()
{
int i;
int a[10];
printf("为数组元素赋值:\n");
for(i=0;i<10;i++){
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
//从小到大排序
CelerityRun(0,9,a);
//输出数组 
for(i=0;i<10;i++){
printf("%d\t",a[i]); //输出制表位 
if(i==4) //如果是第五个元素 
printf("\n"); //输出换行 

return 0; //程序结束 
}
void CelerityRun(int left,int right,int array[]){
int i,j;
int middle,iTemp;
i=left;
j=right;
middle=array[(left+right)/2]; //求中间值
do{
while((array[i]<middle)&&(i<left)) //从左找小于中值的数 
i++;
while((array[j]>middle)&&(j>left)) //从右找大于中值的数 
j--;
if(i<=j){ //找到一对值 
iTemp=array[i];
array[i]=array[j];
array[j]=iTemp;
i++;
j--;
}
} while(i<=j); //如果两边的下标交错,就停止(完成一次)
//递归左半边
if(left<j)
CelerityRun(left,j,array);
//递归右半边 
if(right>i) 
CelerityRun(i,right,array);
}

打得很累希望对你有帮助,我才大一而已有问题一起讨论呀!

司马刀剑
高粉答主

2019-04-05 · 每个回答都超有意思的
知道顶级答主
回答量:4.6万
采纳率:93%
帮助的人:7204万
展开全部
你这是用二分法?建议去照着书上的敲吧 真心错误百出 改不过来了。。。
快排 你直接用sort吧(排序最快的)简单
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10],i;
for(i=0;i<10;i++)
cin>>a[i];
sort(a,a+10);
for(i=0;i<10;i++)
cout<<a[i]<<ends;
return 0;
}

如果是其他类型的排序(例如结构体)可以去网上找qsort 函数 更加高级
追问
这就是按着书敲的XD,哪里错误百出了呢?我试的时候没错啊,难道是我数据太少了?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d968bd3
2019-04-06 · TA获得超过276个赞
知道小有建树答主
回答量:156
采纳率:87%
帮助的人:92.2万
展开全部

其实,要理解了sort的原理之后就好办了。
sort的过程:
1,在每个sort中,先取出带排序数组中间的一个数(mid)
2,用两个指针(i,j)从前后两端向中间扫描数组,要求比mid大的数放后面,小的数放前面。
3,判断出i指向的数比mid大,j指向的数比mid小,那么就交换使数组满足第2步的条件,继续扫描。
直到扫描完整个数组。
4,扫描完后,会有j=i-1。而且,数组满足从左边到j的数都不大于mid,从i到右边的数都不小于mid(即右边的数都大于左边的数,但是两边内部不一定排好序)。
5,以第四步里的分界,分别对左右两边进行递归,用sort函数继续整理(所以前面要判断l<r)。
6,直到全部都递归完数组就排号序了。
代码如下:


纯手打,望采纳,谢谢。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式