编写一个程序分别实现冒泡排序和快速排序算法。要求:两种排序算法都不仅要输出最终排序序列,还要输出排

麻烦各位了。附部分参考代码:#include <stdio.h>#define false 0#define true 1#define maxsize 20typedef struct{ int r[maxsize+1];    //r[0]闲置或用作中转、哨兵单元 int length;}sqlist;void BubbleSort(sqlist &L) { int i,j, Exchange;for  (i=1;i<L.length;i++){ Exchange = false;for (j = 1;  j <= L.length-i;  j++)if (L.r[j+1] < L.r[j]) { L.r[0] =L.r[j];L.r[j] =L.r[j+1];L.r[j+1] =L.r[0];Exchange = true;} if (Exchange == false) return;   } } // BubbleSortint Partition (sqlist &L, int low, int high){int pivotkey;L.r[0]=L.r[low];pivotkey=L.r[low];while(low<high)  { while(low<high&&L.r[high]>=pivotkey)--high;    L.r[low]=L.r[high];    while(low<high&&L.r[low]<=pivotkey)++low;    L.r[high]=L.r[low];  }L.r[low]=L.r[0];return low;}void QSort (sqlist &L,int low,int high){int pivotloc;if (low<high)  {pivotloc=Partition(L,low,high);    QSort(L,low,pivotloc-1);    QSort(L,high,pivotloc+1);  }}

下面是我以前写的,希望对你有帮助。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define N 100 //产生的数的个数

//冒泡排序

void Bubble_Sort(int R[],int n ){
char flag='0';
cout<<"是否输出所有的数字(1/0):"<<endl;
cin>>flag;
while(flag>'1'||flag<'0'){
cout<<"输入有误,请重新输入:"<<endl;
cin>>flag;
}
int i;
if(flag=='1'){
cout<<"排序前:"<<endl;
for( i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
for(i=1;i<n;i++){ //执行n-1趟
int swap=0;
for(int j=1;j<=n-i;j++){

if(R[j] > R[j+1] ){
R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];

swap=1;
}
}
if(swap==0) // 没有发生一次交换,说明序列有序,则跳出循环,排序结束
break;
}
if(flag=='1'){
cout<<"冒泡排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}

}

//快速排序
int Partition(int R[],int i,int j){ //已R[i]为支点进行划分,算法返回支点记录最终的位置
R[0]=R[i]; //缓存支点记录
while(i<j){ //从表的两端交替地向中间扫描
while(i<j&&R[j]>=R[0])
j--;

if(i<j){ //将比支点记录小的交换到前面
R[i]=R[j];
i++;

}
while(i<j&&R[i]<R[0])
i++;

if(i<j){ //将比支点记录大的交换到后面
R[j]=R[i];
j--;
}
}
R[i]=R[0];

return i;
}
void Quick_Sort(int R[],int s,int t){
int i;
if(s<t){
i=Partition(R,s,t); //将表一分为二
Quick_Sort(R,s,i-1); //对支点前端子表递归排序
Quick_Sort(R,i+1,t); //对支点后端子表递归排序
}
}
void Quick(int R[],int n){
char flag='0';
cout<<"是否输出所有的数字(1/0):"<<endl;
cin>>flag;
while(flag>'1'||flag<'0'){
cout<<"输入有误,请重新输入:"<<endl;
cin>>flag;
}
int i;
if(flag=='1'){
cout<<"排序前:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}

Quick_Sort(R,1,n);

if(flag=='1'){
cout<<"快速排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
}

int main(){
while(1){
int R[N+1],i;
cout<<"1 在完全随机的情况下对关键码进行排序"<<endl;
cout<<"2 在完全正序的情况下对关键码进行排序"<<endl;
cout<<"3 在完全逆序的情况下对关键码进行排序"<<endl;
cout<<"0 退出"<<endl;
cout<<"请选择:"<<endl;
char p;
cin>>p;
while(p-48<0||p-48>3){
cout<<"输入有误,请重新输入:"<<endl;
cin>>p;
}
if(p-48==0)
break;
if(p-48==1){
srand((unsigned)time(NULL));
for(i=1;i<=N;i++)
R[i]=rand()%10000+1;
}
else if(p-48==2){
for(i=1;i<=N;i++)
R[i]=i;
}
else
for(i=N;i>=1;i--)
R[N-i+1]=i;

char k;
cout<<endl;

cout<<"1 冒泡排序"<<endl;
cout<<"2 快速排序"<<endl;
cout<<"0 退出"<<endl;

cout<<"请选择排序方法:"<<endl;
cin>>k;
while(k-48<0||k-48>2){
cout<<"输入有误,请重新输入:"<<endl;
cin>>k;
}
switch(k-48){
case 0:cout<<"谢谢使用!"<<endl;exit(0);
case 1:Bubble_Sort(R,N);break;
case 2:Quick(R,N);break;
}
system("pause");system("cls");
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-25
利用快速排序算法,目前速度最快的就是这个算法啦!
#include<stdio.h>
#define swap(a,b)
void quick(int *a,int s,int t)
{
int i=s,j=t+1;
do
{
do i++;while(a[i]>a[s]);
do j--;while(a[j]<a[s]);
if(i<j) swap(a[i],a[j]);
}while(i<j);
swap(a[s],a[j]);
if(s<j-1) quick(a,s,j-1);
if(j+1<t) quick(a,j+1,t);
}
void print(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[1800],i;
for(i=0;i<1800;i++)
a[i]=2300+i;
quick(a,0,1799);
print(a,10);
return 0;
}

完全满足你的需求! 希望你对有用!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网