编写程序在运行时产生1000个随机整数,分别用冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序对该1000个随机整数进行排序,统计每一种排序算法在执行过程中的比较次数、赋值次数。哪位大神有程序,本人学渣一枚。急等!!!!!今天就截止了求帮忙万分感谢,没豆豆了,解决了我帮你充话费可行
这题你只要把每个算法的程序代码看一下,在计算下就行冒泡排序:两个循环,从1加到N,(1+N)N/2 = 500500,最坏交换情况是每次判断都要交换,既500500*3次选择排序:也是两个循环,比较次数跟冒泡排序一样500500,但是这个只要底层循环交换,既只需1000*3 = 3000次赋值。插入排序:循环次数一样500500,但是这个最坏情况是每比较一次就赋值一次,既需500500次赋值希尔排序:时间复杂度是N^1.3倍,比较次数和赋值应该是1000^1.3次方。归并排序和快速排序,你去查查它的时间复杂度是怎么算,O(lgN*N),好像有系数,算法导论那本书上有,现在不记得是多少了。希望能帮到你, 追问 万分感谢你的回答,不过大神,我是学渣,我要是会编就不用百度知道了,给个源代码供参考下行不谢谢了啊 追答 http://blog.csdn.net/xiazdong/article/details/8462393
#include<stdio.h> #include<stdlib.h> #include <math.h> #define L 8 //排序元素个数 #define FALSE 0 #define TRUE 1 typedef struct { int key; char otherinfo; }RecType; typedef RecType Seqlist[L+1]; int num; //定义排序趟数的全局变量 Seqlist R; //直接插入排序 void Insertsort() { int i,j,k,m=0; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); for(i=2;i<=L;i++) { if(R[i].key<R[i-1].key) { R[0]=R[i]; j=i-1; while(R[0].key<R[j].key) { R[j+1]=R[j]; j--; } R[j+1]=R[0]; } m++; printf("\t\t第%d趟排序结果为(按回车键继续):\n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); } printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } //希尔排序 void Shellsort() { int i,j,gap,x,m=0,k; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); gap=L/2; while(gap>0) { for(i=gap+1;i<=L;i++) { j=i-gap; while(j>0) { if(R[j].key>R[j+gap].key) { x=R[j].key; R[j].key=R[j+gap].key; R[j+gap].key=x; j=j-gap; } else { j=0; } } } gap=gap/2; m++; printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); } printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } //冒泡排序 void Bubblesort() { int i,j,k; int exchange; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); for(i=1;i<L;i++) { exchange=FALSE; for(j=L;j>=i+1;j--) { if(R[j].key<R[j-1].key) { R[0].key=R[j].key; R[j].key=R[j-1].key; R[j-1].key=R[0].key; exchange=TRUE; } } if(exchange) { printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",i); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); } } printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } int Partition(int i,int j) //i和j为形式参数,分别代表low和high { RecType pirot=R[i]; while(i<j) { while(i<j&&R[j].key>=pirot.key) { j--; } if(i<j) { R[i++]=R[j]; } while(i<j&&R[j].key<=pirot.key) { i++; } if(i<j) { R[j--]=R[i]; } } R[i]=pirot; return i; } //递归形式为快速排序 void Quicksort(int low,int high) { int pirotpos,k; if(low<high) { pirotpos=Partition(low,high); num++; printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",num); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); Quicksort(low,pirotpos-1); Quicksort(pirotpos+1,high); } } //选择排序 void Selectsort() { int i,j,k,h; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); for(i=1;i<L;i++) { h=i; for(j=i+1;j<=L;j++) { if(R[j].key<R[h].key) { h=j; } } if(h!=j) { R[0]=R[i]; R[i]=R[h]; R[h]=R[0]; } printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",i); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); } printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } void Merge(int low,int mm,int high) { int i=low,j=mm+1,p=0; RecType *R1; R1=new RecType[high-low+1]; if(!R1) { printf("内存容量不够!"); } while(i<=mm&&j<=high) { R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++]; } while(i<=mm) { R1[p++]=R[i++]; } while(j<=high) { R1[p++]=R[j++]; } for(p=0,i=low;i<=high;p++,i++) { R[i]=R1[p]; } } void MergePass(int length) { int i; for(i=1;i+2*length-1<=L;i=i+2*length) { Merge(i,i+length-1,i+2*length-1); } if(i+length-1<L) { Merge(i,i+length-1,L); } } //归并排序 void Mergesort() { int length,k,m=0,i; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); for(length=1;length<L;length*=2) { MergePass(length); m++; printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); } printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } //堆建 void CreateHeap(int root,int index) { int j,temp,finish; j=2*root; temp=R[root].key; finish=0; while(j<=index&&finish==0) { if(j<index) { if(R[j].key<R[j+1].key) { j++; } } if(temp>=R[j].key) { finish=1; } else { R[j/2].key=R[j].key; j=j*2; } } R[j/2].key=temp; }//堆排序 void Heapsort() { int i,j,temp,k; for(i=(L/2);i>=1;i--) { CreateHeap(i,L); } for(i=L-1,k=1;i>=1;i--,k++) { temp=R[i+1].key; R[i+1].key=R[1].key; R[1].key=temp; CreateHeap(1,i); printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",k); for(j=1;j<=L;j++) { printf("%5d",R[j].key); } getchar(); printf("\n"); } } void Heap() { int i; printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } getchar(); printf("\n"); Heapsort(); printf("\n\t\t排序的最终结果是:\n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } main() { Seqlist S; int i,k; char ch1,ch2,q; printf("\n\t\t1000个随机数产生:\n\t\t"); for(i=1;i<=1000;i++) { S[i].key = rand() % 999 + 1; //产生1-1000的随机数 //printf("%d\n", number); // 去掉注释显示随机数的输出} printf("\n\t\t排序数据已经输入完毕!"); ch1='y'; while(ch1=='y'||ch1=='Y') { printf("\n"); printf("\n\t\t 排 序 子 系 统 \n"); printf("\n\t\t*******************************************\n"); printf("\n\t\t* 1--------更新排序数据 *\n"); printf("\n\t\t* 2--------直接插入排序 *\n"); printf("\n\t\t* 3--------希 尔 排 序 *\n"); printf("\n\t\t* 4--------冒 泡 排 序 *\n"); printf("\n\t\t* 5--------快 速 排 序 *\n"); printf("\n\t\t* 6--------选 择 排 序 *\n"); printf("\n\t\t* 7--------归 并 排 序 *\n"); printf("\n\t\t* 8--------堆 排 序 *\n"); printf("\n\t\t* 0--------返 回 *\n"); printf("\n\t\t*******************************************\n"); printf("\n\t\t 请选择菜单号(0--8):"); scanf("%c",&ch2); getchar(); for(i=1;i<=L;i++) { R[i].key=S[i].key; } switch(ch2) { case '1': printf("\n\t\t请输入%d个待排序数据(按回车键分隔):\n\t\t",L); for(i=1;i<=L;i++) { scanf("%d",&S[i].key); getchar(); printf("\t\t"); } printf("\n\t\t排序数据已经输入完毕!"); break; case '2': Insertsort(); break; case '3': Shellsort(); break; case '4': Bubblesort(); break; case '5': printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } getchar(); printf("\n"); num=0; Quicksort(1,L); printf("\n\t\t排序的最终结果是:\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); break; case '6': Selectsort(); break; case '7': Mergesort(); break; case '8': Heap(); break; case '0': ch1='n'; break; default: system("cls"); printf("\n\t\t 对不起,您的输入有误,请重新输入!\n"); break; } if(ch2!='0') { if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8') { printf("\n\n\t\t排序输出完毕!"); printf("\n\t\t按回车键返回。"); q=getchar(); if(q!='\xA') { getchar(); ch1='n'; } } } } } 追问 感谢你的回答,我在文库里有看到这个程序,但这不是我想要的,原谅我是学渣 追答 修改过一部分,直接生成1000个随机数。后面就是一样的了