这是我很久以前的一个课程设计作业,放这里以后可以参考。
在vc下可以运行,但在dev-c++下有点小问题,算了,我不改了,反正以后也只看那些算法而不需要做这种无聊的课程设计了的。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define N 10000 //产生的数的个数
static __int64 compare_num; //数据比较次数(不包括比较下标) ,有些排序算法需要不断的调用其他函数,所以要用静态量
static __int64 transmit_num; //数据传递次数 ,这里一次交换等于3次赋值传递,这里主要是因为有些排序算法是通过插入数据来进行排序的
//直接选择排序
void Select_Sort(int R[],int n){
compare_num=0;
transmit_num=0;
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;
}
int k;
clock_t begin,end;
begin=clock(); //排序前的时间点
for(i=1;i<n;i++){ //做n-1 趟选取
k=i;
for(int j=i+1;j<=n;j++){ //在i 开始的n-i+1个记录中选取关键码最小的记录
compare_num++;
if(R[j]<R[k] )
k=j;
if(k!=i){
R[0]=R[k];
R[k]=R[i];
R[i]=R[0];
transmit_num+=3;
}
}
}
end=clock(); //排序后的时间点
if(flag=='1'){
cout<<"直接选择排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC; //排序所用的时间,下同
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//冒泡排序
void Bubble_Sort(int R[],int n ){
compare_num=0;
transmit_num=0;
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;
}
clock_t begin,end;
begin=clock();
for(i=1;i<n;i++){ //执行n-1趟
int swap=0;
for(int j=1;j<=n-i;j++){
compare_num++;
if(R[j] > R[j+1] ){
R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
transmit_num+=3;
swap=1;
}
}
if(swap==0) // 没有发生一次交换,说明序列有序,则跳出循环,排序结束
break;
}
end=clock();
if(flag=='1'){
cout<<"冒泡排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//直接插入排序
void D_InsertSort(int R[],int n){
compare_num=0;
transmit_num=0;
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;
}
clock_t begin,end;
begin=clock();
for(i=2;i<=n;i++){
compare_num++;
if(R[i]<R[i-1]){ //小于时,需将R[i]插入到有序表适当位置
R[0]=R[i];
transmit_num++;
for(int j=i-1;R[j]>R[0];j--){
R[j+1]=R[j]; // 记录后移
compare_num++;
transmit_num++;
}
R[j+1]=R[0]; //插入到正确位置
transmit_num++;
}
}
end=clock();
if(flag=='1'){
cout<<"直接插入排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//希尔排序
void ShellInsert(int R[],int n,int dk){
int i;
for(i=dk+1;i<=n;i++){
compare_num++;
if(R[i]<R[i-dk]){ //小于时,需R[i]将插入有序表
R[0]=R[i]; //存储待插入的记录
transmit_num++;
for(int j=i-dk;j>0&&R[j]>R[0];j=j-dk){
R[j+dk]=R[j]; //记录后移
transmit_num++;
compare_num++;
}
R[j+dk]=R[0]; //插入到正确位置
transmit_num++;
}
}
}
void ShellSort(int R[],int n){
compare_num=0;
transmit_num=0;
int t[10]={21,19,17,13,11,7,5,3,2,1}; //步长因子中除1外没有公因子,且最后一个步长因子必须为1
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;
}
clock_t begin,end;
begin=clock();
for(i=0;i<10;i++)
ShellInsert(R,n,t[i]); //调用每个步长因子
end=clock();
if(flag=='1'){
cout<<"希尔排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//快速排序
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--;
compare_num++;
}
if(i<j){ //将比支点记录小的交换到前面
R[i]=R[j];
i++;
transmit_num++;
}
while(i<j&&R[i]<R[0]){
i++;
compare_num++;
}
if(i<j){ //将比支点记录大的交换到后面
R[j]=R[i];
j--;
transmit_num++;
}
}
R[i]=R[0];
transmit_num++;
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){
compare_num=0;
transmit_num=0;
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;
}
clock_t begin,end;
begin=clock();
Quick_Sort(R,1,n);
end=clock();
if(flag=='1'){
cout<<"快速排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//堆排序
void HeapAjust(int R[],int s,int t){
int j;
R[0]=R[s];
for(j=2*s;j<=t;j=2*j){ //沿关键码较大的孩子结点向下筛选
if(j<t && R[j]<R[j+1]){
compare_num++;
j++; //j指向R[i]的关键码较大的孩子
}
if(R[0]>R[j]){ //不用调到叶子就到位了
compare_num++;
break;
}
R[s]=R[j];
transmit_num++;
s=j; //准备向下调整
}
R[s]=R[0]; //插入
}
void HeapSort(int R[],int n){
compare_num=0;
transmit_num=0;
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;
}
clock_t begin,end;
begin=clock();
for(i=n/2;i>0;i--)
HeapAjust(R,i,n); //将R[1]……R[n]建成堆
for(i=n;i>1;i--){
R[0]=R[1]; //堆顶R[1]与堆底R[i]交换
R[1]=R[i];
R[i]=R[0];
transmit_num+=3;
HeapAjust(R,1,i-1); //将R[1]……R[i-1]重新调整为堆
}
end=clock();
if(flag=='1'){
cout<<"堆排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//归并排序
void Merge(int R[],int s,int m,int t){ //把两个有序子表归并
int i,j;
i=s;
j=m+1;
int p=0;
int R1[N];
while(i<=m&&j<=t){
compare_num++;
if(R[i]<R[j]){
R1[p]=R[i];
p++;
i++;
transmit_num++;
}
else{
R1[p]=R[j];
p++;
j++;
transmit_num++;
}
}
while(i<=m){
R1[p]=R[i];
p++;
i++;
transmit_num++;
}
while(j<=t){
R1[p]=R[j];
p++;
j++;
transmit_num++;
}
for(p=0,i=s;i<=t;i++,p++){
R[i]=R1[p];
transmit_num++;
}
}
void Msort(int R[],int s,int t){
int m;
if(s<t){
m=(s+t)/2;
Msort(R,s,m); //递归地将R[s]~R[m]归并为有序的R1[s]~R1[m]
Msort(R,m+1,t); //递归地将R[m+1]~R[t]归并为有序的R1[m+1]~R1[t]
Merge(R,s,m,t); //将R1[s]~R1[m]和R1[m+1]~R1[t]归并到R[s]~R[t]
}
}
void MergeSort(int R[],int n){
compare_num=0;
transmit_num=0;
char flag='0';
cout<<"是否输出所有的数字(1/0):"<<endl;
cin>>flag;
while(flag>'1'||flag<'0'){
cout<<"输入有误,请重新输入:"<<endl;
cin>>flag;
}
int i;
cout<<"排序前:"<<endl;
if(flag=='1'){
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
clock_t begin,end;
begin=clock();
Msort(R,1,n);
end=clock();
if(flag=='1'){
cout<<"归并排序后:"<<endl;
for(i=1;i<=n;i++)
cout<<R[i]<<',';
cout<<endl;
}
double time;
time=(double)(end-begin)/CLOCKS_PER_SEC;
printf("排序过程所用时间为: %.6lf s\n",time);
printf("排序过程比较次数为: %I64d\n",compare_num);
printf("排序过程传递次数为: %I64d\n",transmit_num);
}
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<<"3 冒泡排序"<<endl;
cout<<"4 快速排序"<<endl;
cout<<"5 直接选择排序"<<endl;
cout<<"6 堆排序"<<endl;
cout<<"7 归并排序"<<endl;
cout<<"0 退出程序"<<endl;
cout<<"请选择排序方法:"<<endl;
cin>>k;
while(k-48<0||k-48>7){
cout<<"输入有误,请重新输入:"<<endl;
cin>>k;
}
switch(k-48){
case 0:cout<<"谢谢使用!"<<endl;exit(0);
case 1:D_InsertSort(R,N);break;
case 2:ShellSort(R,N);break;
case 3:Bubble_Sort(R,N);break;
case 4:Quick(R,N);break;
case 5:Select_Sort(R,N);break;
case 6:HeapSort(R,N);break;
case 7:MergeSort(R,N);break;
}
system("pause");system("cls");
}
return 0;
}