c++的快速排序
这段代码是使用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);
}
打得很累希望对你有帮助,我才大一而已有问题一起讨论呀!
快排 你直接用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,哪里错误百出了呢?我试的时候没错啊,难道是我数据太少了?
其实,要理解了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,直到全部都递归完数组就排号序了。
代码如下:
纯手打,望采纳,谢谢。