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

编写一个程序分别实现冒泡排序和快速排序算法。要求:两种排序算法都不仅要输出最终排序序列,还要输出排,第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;

}

/有一种排序方法叫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语言编程 排序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9748942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存