下面是我以前写的,希望对你有帮助。
#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;
}
/有一种排序方法叫Radix Sort,就是针对这种多关键字的排序的
时间复杂度线性的,但是有个缺点就是必须知道关键字的范围,不知道题主的关键字范围是多少?
好吧,假设我的关键字最多有100个,基数最大不超过999
程序如下: /
//Radix Sort算法,采取LSD(低位优先)
#include<stdioh>
#include<stdlibh>
#define KEYNUM 100 //关键字的最大个数
#define RADIX 1000 //基数的范围是0-RADIX-1
typedef struct Node
{
int ele[KEYNUM+1];
struct Node next;
} Node;
Node e[RADIX],f[RADIX]; //链队列的首指针和尾指针表
void init(Node head,int n,int m) //初始化输入链表
{
int i,j;
Node p,q=head;
for(i=0; i<n; i++)
{
p=(Node)malloc(sizeof(Node));
if(!p)
return;
for(j=1; j<=m; j++)
scanf("%d",&p->ele[j]);
p->next=NULL;
q->next=p;
q=q->next;
}
}
void distribute(Node head,int locate,int r) //进行Radix排序
{
Node p,q;
int i;
while(head->next!=NULL)
{
q=head->next;
head->next=q->next;
q->next=NULL;
p=f[q->ele[locate]];
while(p->next!=NULL)
p=p->next;
p->next=q;
e[q->ele[locate]]->next=q;
}
p=head;
for(i=0; i<=r; i++)
{
while(f[i]->next!=e[i]->next)
{
q=f[i]->next;
f[i]->next=q->next;
q->next=NULL;
p->next=q;
p=p->next;
}
q=f[i]->next;
if(q)
{
f[i]->next=q->next;
q->next=NULL;
p->next=q;
p=p->next;
}
f[i]->next=e[i]->next=NULL;
}
}
void display(Node head,int m) //显示链表各个节点
{
int i;
Node p=head->next;
if(!head)
return;
while(p)
{
for(i=1; i<=m; i++)
printf("%d ",p->ele[i]);
printf("\n");
p=p->next;
}
}
void Delete(Node head) //释放链表节点
{
Node p;
if(!head)
return;
while(head->next)
{
p=head->next;
head->next=p->next;
free(p);
}
}
int main()
{
Node head;
int n,m,r,i;
for(i=0; i<RADIX; i++) //初始化首尾指针指向空指针
{
f[i]=(Node)malloc(sizeof(Node));
e[i]=(Node)malloc(sizeof(Node));
if(!f[i]||!e[i])
exit(1);
f[i]->next=e[i]->next=NULL;
}
head=(Node)malloc(sizeof(Node));
if(!head)
return 1;
printf("待排序个数以及关键字的个数:");
scanf("%d%d",&n,&m);
printf("输入数据:\n");
init(head,n,m);
printf("输入基数范围0-n:");
scanf("%d",&r);
for(i=m; i>=1; i--)
distribute(head,i,r); //从低位到高位进行Radix排序
display(head,m);
for(i=0; i<RADIX; i++) //释放首尾指针数组
{
free(f[i]);
free(e[i]);
}
Delete(head);
free(head);
return 0;
}
题主的答案:
更复杂的情况:
以上就是关于编写一个程序分别实现冒泡排序和快速排序算法。要求:两种排序算法都不仅要输出最终排序序列,还要输出排全部的内容,包括:编写一个程序分别实现冒泡排序和快速排序算法。要求:两种排序算法都不仅要输出最终排序序列,还要输出排、C语言编程 排序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)