2021-01-15

排序算法综合(C++)


问题描述

利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
要求:
1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。
2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。


让我们走进本次排序综合程序。
在这里插入图片描述

一、排序综合算法的各个组件

1、头文件以及全局变量

#include<iostream>
#include <cstring>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std; 
int N; //随机产生数据的个数 

2、函数声明

void writeData();//随机产生N个数存入txt文件 
int readData(int num[]) ;//读取txt文件中的数据存入数组num[] 
void printData(int num[]); //输出随机产生的N个数据
void menu();//菜单用于选择所需排序算法 

void SInsertSort(int num[]);//直接插入排序算法
void BInsertSort(int num[]);//折半插入排序算法 
void ShellInsertSort(int num[]);//希尔排序算法
void BubbleSort(int num[]);//起泡排序算法 
void QuickSort(int num[],int low,int high);//快速排序算法
void SelectSort(int num[]);//选择排序算法 
void InitHeap(int num[], int i, int j);//大根堆初始化算法
void Heapsort(int num[]);//大根堆排序算法 
void Msort(int num[],int low,int mid,int high); //归并排序中合并算法 
void Mergesort(int num[],int low,int high);//归并排序中拆分算法 

3、写数据(writeData()

     用于打开txt文件,利用rand()产生随机数并存入txt文档,
     fopen(“x.txt","w")打开x.txt文档并且写操作
     fclose(fp)关闭fp对象对文档的写入
void writeData(){//随机产生N个数存入txt文件 
 FILE* fp=fopen("data.txt","w");
        for(int i=0;i<N;i++)
       {
          fprintf(fp,"%d ",rand());
      }
    fclose(fp);
} 

4、读数据(readData(int num[])

     用于读取data.txt文档中的数据并存入num【】数组,首先应该判断文档是否为空,非空时将每个数据存入数组
int readData(int num[]) {//读取txt文件中的数据存入数组num[]
    FILE *fp;
    fp=fopen("data.txt","r");
    if (fp==NULL){
        fclose(fp);
        return 0;
    }
    else
    {
        for (int i=0; i<N;i++){
            fscanf(fp,"%d",&num[i]);
			}
        fclose(fp);
        return 1;
    }
}

5、打印数据(printData(int num[])

     用于打印排序前后num【】数组的内容
void printData(int num[]) //打印数据 
{
    for(int i=0;i<N;i++)
    {
     cout<<num[i]<<"\t";
    }
    cout<<endl;
}

6.八大排序算法

在这里插入图片描述

6.1直接插入排序( SInsertSort(int num[])

  记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表
void SInsertSort(int num[]){
for(int i=1;i<N;i++){
	for(int j=i-1;j>=0;j--){
		if(num[j]>num[j+1]){
			swap(num[j],num[j+1]);
		}
	}
  }
} 

6.2 折半插入排序( BInsertSort(int num[])

 顺序地把待排序的序列中的各个元素按其关键字的大小,通过折半查找插入到已排序的序列的适当位置。
void BInsertSort(int num[]){
   int mid,low,high,t,i,j;
   for(i=1;i<N;i++){
   	     t=num[i];
         low=0;
         high=i-1;
     	while(low<=high){
   	    	mid=(high+low)/2;
   	    	if(num[mid]>t){
   			    high=mid-1;
		    }
		    else{
			  low=mid+1;
		   }
	   }
	    for (j =i-1;j>=high+1;j--){//将num[high]之后的数据全部后移一位
	    		num[j+1] = num[j];
		}
            num[high+1] = t;//将关键字插入num[high+1]        
   }
   
        	
} 

6.3 希尔排序( ShellInsertSort(int num[],int dk)

先将整体待排序列分割成为若干个子序列分别进行直接插入排序,
待整个序列中的记录“基本有序”时,再对整体进行一次直接插入排序,
dk为希尔值 
void ShellInsertSort(int num[],int dk){//dk选择的希尔数 
	 for(int id=dk;id>0;id--){
	 	for(int i=0;i<id;i++){
	 		for(int j=i+id;j<N;j+=id){
	 			if(num[j]<num[j-id]){
	 				int t=num[j];
	 				int n=j-id;
	 				while(n>=0&&num[n]>t){
	 					num[n+id]=num[n];
	 					n=n-id;
					 }
					 num[n+id]=t;
				 }
			 }
		 } 
	 } 
}

6.4 冒泡排序(BubbleSort(int num[])

  冒大泡:  首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序, 则将两个记录交换一下,
  然后比较第二个和第 三个关键字,以此类推
  冒小泡: 首先将第一个记录的关键字和第二个记录的关键字进行比较,若为顺序, 则将两个记录交换一下,
  然后比较第二个和第三个关键字,以此类推
void BubbleSort(int num[]){
	int tag=0;//标志位 
	cout<<"请选择起泡方式:1、冒大泡,2、冒小泡"<<endl;
	cin>>tag; 
	int i,j;
	switch(tag)	{
		    case 1:
		    	for(i = 0;i<N;i++){
                    for( j =1;j<N-i;j++){
                       if(num[j-1]>num[j]) //冒大泡 
		         	    {
		         	        swap(num[j-1],num[j]);
		                }
                    }
                }
                cout<<"冒大泡排序结果:"<<endl; 
                break;
			case 2:
				for( i = 0;i<N;i++){
                    for( j =1;j<N-i;j++){
                       if(num[j-1]<num[j]) //冒小泡 
		               	{
		             	swap(num[j-1],num[j]);
		             	}
                    }
               }
                cout<<"冒小泡排序结果:"<<endl; 
               break;
           default:
              cout<<"输入错误!请重新输入!"<<endl;
             BubbleSort( num);
    }
} 

6.5 快速排序(QuickSort(int num[],int low,int high)

   通过一趟排序将待排序列分割为独立的两部分,其中一部分比关键字小,
   一部分比关键字大,然后对两部分继续进行快速排序,以达到整个待排序列有序
void QuickSort(int num[],int low,int high){
	if(low<high){	
	 int i=low;
	 int j=high;
	 int key=num[low];
     while(i<j){
     	while(i<j&&num[j]>key) {
		 j--;
		 }
        if(i<j){
        	num[i++]=num[j];
		}
		 while(i<j&&num[i]<key) {
		 i++;
		 }
		 if(i<j){
     		num[j--]=num[i]; 
	 }
	 }    
	 num[i]=key;
	 QuickSort(num,low,i-1);
	 QuickSort(num,i+1,high);
	 }	 
}

6.6 选择排序(SelectSort(int num[])

  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
  顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完
void SelectSort(int num[]){
   int min;
   for(int i=0;i<N;i++){
   	   min=i;
   	   for(int j=i+1;j<N;j++){
   	   	if(num[j]<num[min]){
   	   		min=j;
			  }
		  }
	 swap(num[i],num[min]);
   }
} 

6.7 堆排序(Heapsort(int num[])

  1、初始化堆:根据数组构建大根堆; 
  2、将当前无序区的堆顶元素同该区间的最后一个记录交换,然后将新的无序区调整为新的大根堆
void InitHeap(int num[], int i, int j) {//初始化大根堆						
	int parent=i;										
	int lchild=2*i+1;//i的左孩子									
	while (lchild<j) {
		if (num[lchild]<num[lchild+1]&&lchild<j-1) {	//比较左右子节点 
			lchild++;
		}
		if (num[parent]<num[lchild]) {				
			swap(num[parent],num[lchild]);					
			parent=lchild;								
		}
        lchild=lchild * 2 + 1;								
	}
}
void Heapsort(int num[]) {												
	for (int i=N/2-1;i>= 0;i--) {							
		InitHeap(num,i,N);								
	}								
	for (int i=N-1;i>0;i--)
	{
		swap(num[0],num[i]);//堆顶元素与最后一个元素交换								
		InitHeap(num,0,i);//重新建堆 
}
}

6.8 归并排序(Mergesort(int num[],int low,int high)

    它分为拆分和合并两大部分,先拆后合。
      拆分:就是将一堆无序的数拆成单个,方便合并。
	  合并:就是将拆分好的数按照排序规则再拼凑起来。
void Msort(int num[],int low,int mid,int high){
	int temp[N];
	int l=low;
	int j=mid+1;
	int m=mid;
	int h=high;
		int i=low;
		  while(l<=m&&j<=h){
        if(num[l]>num[j])
            temp[i++] = num[j++] ;
        else
            temp[i++] = num[l++] ;
    }
    //将两边剩余元素加到temp的末尾 
    while(l<=m) 
        temp[i++] = num[l++] ;
    while(j<=h)
        temp[i++] = num[j++] ;

	for(i=low;i<=high;++i){
	num[i]=temp[i]; 
   }
}
void Mergesort(int num[],int low,int high){
	if(low<high){
	int mid=(low+high)/2;
	Mergesort(num,low,mid);//拆分 
	Mergesort(num,mid+1,high);
	Msort(num,low,mid,high);//合并 
	}
}

}

7、菜单(menu()

      用于选择你需要的算法,并且将排序结果保存到txt文件中,
       并计算八种排序的上机运行程序所花费的时间,用于比较性能
            double sittime;
	        start=clock(); //开始时间
			 SInsertSort(num);
			 end=clock();//结束时间
			 sittime=double(end-start);
			 sittime=sittime/CLOCKS_PER_SEC; //毫秒转化为秒
void menu(){
	int num[N];
    int tag=0;
    while(tag!=9){
    	cout<<"$________$Menu$___________$"<<endl; 
	    cout<<" *****1-直接插入排序*****"<<endl;
	    cout<<" *****2-折半插入排序*****"<<endl;
	    cout<<" *****3-希尔排序*********"<<endl;
	    cout<<" *****4-起泡排序*********"<<endl;
	    cout<<" *****5-快速排序*********"<<endl;
	    cout<<" *****6-选择排序*********"<<endl;
	    cout<<" *****7-大根堆排序*******"<<endl;
	    cout<<" *****8-归并排序*********"<<endl;
	    cout<<" *****9-退出*************"<<endl;
	    cout<<"$_________$$$____________$"<<endl;
	    cout<<"   请输入你需要的操作:";
        cin>>tag; 
        double start,end;//开始时间,结束时间 
    	switch(tag){
    	    case 1:{
				readData(num);
    	    	double sittime;
    	    	 start=clock(); 
    			 SInsertSort(num);
    			 end=clock();
    			 sittime=double(end-start);
    			 sittime=sittime/CLOCKS_PER_SEC; 
    			 cout<<"直接插入排序结果:"<<endl;
    			 FILE * f1=fopen("data1.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f1,"%d ",num[i]);
                          }
                  printData(num);
                  fclose(f1);
                   cout<<"直接插入排序运行时间:"<<sittime<<"秒"<<endl;
                  cout<<endl;
    			 break;
			}
    	    
    		case 2:{
				readData(num);
    			double bittime;
    			start=clock();
    			 BInsertSort(num);
    			 end=clock();
    			 bittime=double(end-start);
    			 bittime=bittime/CLOCKS_PER_SEC; 
    			  cout<<"折半插入排序结果:"<<endl; 
    			  FILE * f2=fopen("data2.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f2,"%d ",num[i]);
                          }
                  fclose(f2);
		          printData(num);
		          cout<<"折半插入排序运行时间:"<<bittime<<"秒"<<endl;
		        cout<<endl;
    			 break;
			}
    		
    		case 3:{
    			readData(num);
    			double shittime;
    			 int dk;
				 cout<<"请输入首次希尔值:";
				 cin>>dk; 
				start=clock();
    			 ShellInsertSort(num,dk);
    			end=clock();
    			shittime=double(end-start);
    			 shittime=shittime/CLOCKS_PER_SEC; 
    		    cout<<"希尔排序结果:"<<endl;
    		    FILE * f3=fopen("data3.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f3,"%d ",num[i]);
                          }
                  fclose(f3);
    			 printData(num);
    			 cout<<"希尔排序运行时间:"<<shittime<<"秒"<<endl;
    			cout<<endl;
    			 break;
			}
    		
			case 4:{
				readData(num);
				double bitime;
				start=clock();
    			BubbleSort(num);
    			end=clock();
    			bitime=double(end-start);
    			 bitime=bitime/CLOCKS_PER_SEC;
    			 FILE * f4=fopen("data4.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f4,"%d ",num[i]);
                          }
                  fclose(f4);
    			 printData(num);
    			 cout<<"冒泡排序运行时间:"<<bitime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}	
			case 5:{
				readData(num);
				double qstime;
				start=clock();
    			 QuickSort(num,0,N-1);
    			end=clock();
    		    qstime=double(end-start);
    			 qstime=qstime/CLOCKS_PER_SEC;
    			 cout<<"快速排序结果:"<<endl;
    			 FILE * f5=fopen("data5.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f5,"%d ",num[i]);
                          }
                  fclose(f5);
    			 printData(num);
    			 cout<<"快速排序运行时间:"<<qstime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}	
			case 6:{
				readData(num);
				double sstime;
				 
    			 SelectSort(num);
    			end=clock();
    		    sstime=double(end-start);
    			 sstime=sstime/CLOCKS_PER_SEC;
    			 cout<<"选择排序结果:"<<endl;
    			 FILE * f6=fopen("data6.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f6,"%d ",num[i]);
                          }
                  fclose(f6);
    			 printData(num);
    			 cout<<"选择排序运行时间:"<<sstime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}
			
    		case 7:{
    			readData(num);
    			 double hstime;
				start=clock();
    		    Heapsort(num);
    			end=clock();
    		    hstime=double(end-start);
    			 hstime=hstime/CLOCKS_PER_SEC;
    			 cout<<"大根堆排序结果:"<<endl;
    			 FILE * f7=fopen("data7.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f7,"%d",num[i]);
                          }
                  fclose(f7);
    			 printData(num);
    			 cout<<"大根堆排序运行时间:"<<hstime<<"秒"<<endl;
    		     cout<<endl;
    			 break;
			}
    		
    		case 8:{
				readData(num);
    			double mstime;
				start=clock();
    		     Mergesort(num,0,N-1);
    			end=clock();
    		    mstime=double(end-start);
    			 mstime=mstime/CLOCKS_PER_SEC;
    			 cout<<"归并排序结果:"<<endl;
    			 FILE * f8=fopen("data8.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f8,"%d ",num[i]);
                          }
                  fclose(f8);
    			 printData(num);
    			 cout<<endl;
    			 cout<<"归并排序运行时间:"<<mstime<<"秒"<<endl;
    			 break;
			}
    		
		}
    } 
} 

二、算法结果展示(仅展示部分

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、程序源代码

#include<iostream>
#include <cstring>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std; 

int N; //随机产生数据的个数 

void writeData();//随机产生N个数存入txt文件 
int readData(int num[]) ;//读取txt文件中的数据存入数组num[] 
void printData(int num[]); //输出随机产生的N个数据
void menu();//菜单用于选择所需排序算法 

void SInsertSort(int num[]);//直接插入排序算法
void BInsertSort(int num[]);//折半插入排序算法 
void ShellInsertSort(int num[]);//希尔排序算法
void BubbleSort(int num[]);//起泡排序算法 
void QuickSort(int num[],int low,int high);//快速排序算法
void SelectSort(int num[]);//选择排序算法 
void InitHeap(int num[], int i, int j);//大根堆初始化算法
void Heapsort(int num[]);//大根堆排序算法 
void Msort(int num[],int low,int mid,int high); //归并排序中合并算法 
void Mergesort(int num[],int low,int high);//归并排序中拆分算法 

void writeData(){//随机产生N个数存入txt文件 
 FILE* fp=fopen("data.txt","w");
        for(int i=0;i<N;i++)
       {
          fprintf(fp,"%d ",rand());
      }
    fclose(fp);
} 
int readData(int num[]) //读取txt文件中的数据存入数组num[]
{
    FILE *fp;
    fp=fopen("data.txt","r");
    if (fp==NULL){
        fclose(fp);
        return 0;
    }
    else
    {
        for (int i=0; i<N;i++){
            fscanf(fp,"%d",&num[i]);
			}
        fclose(fp);
        return 1;
    }
}

void printData(int num[]) //打印数据 
{
    for(int i=0;i<N;i++)
    {
     cout<<num[i]<<"\t";
    }
    cout<<endl;
}

/*直接插入排序:将记录插入到已排好序的有序表中,
              从而得到一个新的、记录数增1的有序表*/
void SInsertSort(int num[]){
for(int i=1;i<N;i++){
	for(int j=i-1;j>=0;j--){
		if(num[j]>num[j+1]){
			swap(num[j],num[j+1]);
		}
	}
  }
} 

/*折半插入排序:顺序地把待排序的序列中的各个元素按其关键字的大小,
               通过折半查找插入到已排序的序列的适当位置。*/
void BInsertSort(int num[]){
   int mid,low,high,t,i,j;
   for(i=1;i<N;i++){
   	     t=num[i];
         low=0;
         high=i-1;
     	while(low<=high){
   	    	mid=(high+low)/2;
   	    	if(num[mid]>t){
   			    high=mid-1;
		    }
		    else{
			  low=mid+1;
		   }
	   }
	    for (j =i-1;j>=high+1;j--){//将num[high]之后的数据全部后移一位
	    		num[j+1] = num[j];
		}
            num[high+1] = t;//将关键字插入num[high+1]        
   }
   
        	
} 

/*希尔排序:先将整体待排序列分割成为若干个子序列分别进行直接插入排序,
    待整个序列中的记录“基本有序”时,再对整体进行一次直接插入排序 */ 
void ShellInsertSort(int num[],int dk){//dk选择的希尔数 
	 for(int id=dk;id>0;id--){
	 	for(int i=0;i<id;i++){
	 		for(int j=i+id;j<N;j+=id){
	 			if(num[j]<num[j-id]){
	 				int t=num[j];
	 				int n=j-id;
	 				while(n>=0&&num[n]>t){
	 					num[n+id]=num[n];
	 					n=n-id;
					 }
					 num[n+id]=t;
				 }
			 }
		 } 
	 } 
}

/* 起泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,
            则将两个记录交换一下,然后比较第二个和第三个关键字,以此类推 */
void BubbleSort(int num[]){
	int tag=0;//标志位 
	cout<<"请选择起泡方式:1、冒大泡,2、冒小泡"<<endl;
	cin>>tag; 
	int i,j;
	switch(tag)	{
		    case 1:
		    	for(i = 0;i<N;i++){
                    for( j =1;j<N-i;j++){
                       if(num[j-1]>num[j]) //冒大泡 
		         	    {
		         	        swap(num[j-1],num[j]);
		                }
                    }
                }
                cout<<"冒大泡排序结果:"<<endl; 
                break;
			case 2:
				for( i = 0;i<N;i++){
                    for( j =1;j<N-i;j++){
                       if(num[j-1]<num[j]) //冒小泡 
		               	{
		             	swap(num[j-1],num[j]);
		             	}
                    }
               }
                cout<<"冒小泡排序结果:"<<endl; 
               break;
           default:
              cout<<"输入错误!请重新输入!"<<endl;
             BubbleSort( num);
    }
} 

/*快速排序:通过一趟排序将待排序列分割为独立的两部分,其中一部分比关键字小,
       一部分比关键字大,然后对两部分继续进行快速排序,以达到整个待排序列有序*/ 
void QuickSort(int num[],int low,int high){
	if(low<high){	
	 int i=low;
	 int j=high;
	 int key=num[low];
     while(i<j){
     	while(i<j&&num[j]>key) {
		 j--;
		 }
        if(i<j){
        	num[i++]=num[j];
		}
		 while(i<j&&num[i]<key) {
		 i++;
		 }
		 if(i<j){
     		num[j--]=num[i]; 
	 }
	 }    
	 num[i]=key;
	 QuickSort(num,low,i-1);
	 QuickSort(num,i+1,high);
	 }	 
}
/*选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
          顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。*/ 
void SelectSort(int num[]){
   int min;
   for(int i=0;i<N;i++){
   	   min=i;
   	   for(int j=i+1;j<N;j++){
   	   	if(num[j]<num[min]){
   	   		min=j;
			  }
		  }
	 swap(num[i],num[min]);
   }
} 
/*堆排序: 1、初始化堆:根据数组构建大根堆; 
           2、将当前无序区的堆顶元素同该区间的最后一个记录交换,然后将新的无序区调整为新的大根堆*/
void InitHeap(int num[], int i, int j) {//初始化大根堆						
	int parent=i;										
	int lchild=2*i+1;//i的左孩子									
	while (lchild<j) {
		if (num[lchild]<num[lchild+1]&&lchild<j-1) {	//比较左右子节点 
			lchild++;
		}
		if (num[parent]<num[lchild]) {				
			swap(num[parent],num[lchild]);					
			parent=lchild;								
		}
        lchild=lchild * 2 + 1;								
	}
}
void Heapsort(int num[]) {												
	for (int i=N/2-1;i>= 0;i--) {							
		InitHeap(num,i,N);								
	}								
	for (int i=N-1;i>0;i--)
	{
		swap(num[0],num[i]);//堆顶元素与最后一个元素交换								
		InitHeap(num,0,i);//重新建堆 
}
}

/*归并排序:它分为拆分和合并两大部分,先拆后合。
          拆分:就是将一堆无序的数拆成单个,方便合并。
		  合并:就是将拆分好的数按照排序规则再拼凑起来。*/
void Msort(int num[],int low,int mid,int high){
	int temp[N];
	int l=low;
	int j=mid+1;
	int m=mid;
	int h=high;
		int i=low;
		  while(l<=m&&j<=h){
        if(num[l]>num[j])
            temp[i++] = num[j++] ;
        else
            temp[i++] = num[l++] ;
    }
    //将两边剩余元素加到temp的末尾 
    while(l<=m) 
        temp[i++] = num[l++] ;
    while(j<=h)
        temp[i++] = num[j++] ;

	for(i=low;i<=high;++i){
	num[i]=temp[i]; 
   }
}
void Mergesort(int num[],int low,int high){
	if(low<high){
	int mid=(low+high)/2;
	Mergesort(num,low,mid);//拆分 
	Mergesort(num,mid+1,high);
	Msort(num,low,mid,high);//合并 
	}
}

/*菜单:用于选择你需要的算法,并且将排序结果保存到txt文件中,
        并计算八种排序的上机运行程序所花费的时间,用于比较性能*/ 
void menu(){
	int num[N];
    int tag=0;
    while(tag!=9){
    	cout<<"$________$Menu$___________$"<<endl; 
	    cout<<" *****1-直接插入排序*****"<<endl;
	    cout<<" *****2-折半插入排序*****"<<endl;
	    cout<<" *****3-希尔排序*********"<<endl;
	    cout<<" *****4-起泡排序*********"<<endl;
	    cout<<" *****5-快速排序*********"<<endl;
	    cout<<" *****6-选择排序*********"<<endl;
	    cout<<" *****7-大根堆排序*******"<<endl;
	    cout<<" *****8-归并排序*********"<<endl;
	    cout<<" *****9-退出*************"<<endl;
	    cout<<"$_________$$$____________$"<<endl;
	    cout<<"   请输入你需要的操作:";
        cin>>tag; 
        double start,end;//开始时间,结束时间 
    	switch(tag){
    	    case 1:{
				readData(num);
    	    	double sittime;
    	    	 start=clock(); 
    			 SInsertSort(num);
    			 end=clock();
    			 sittime=double(end-start);
    			 sittime=sittime/CLOCKS_PER_SEC; 
    			 cout<<"直接插入排序结果:"<<endl;
    			 FILE * f1=fopen("data1.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f1,"%d ",num[i]);
                          }
                  printData(num);
                  fclose(f1);
                   cout<<"直接插入排序运行时间:"<<sittime<<"秒"<<endl;
                  cout<<endl;
    			 break;
			}
    	    
    		case 2:{
				readData(num);
    			double bittime;
    			start=clock();
    			 BInsertSort(num);
    			 end=clock();
    			 bittime=double(end-start);
    			 bittime=bittime/CLOCKS_PER_SEC; 
    			  cout<<"折半插入排序结果:"<<endl; 
    			  FILE * f2=fopen("data2.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f2,"%d ",num[i]);
                          }
                  fclose(f2);
		          printData(num);
		          cout<<"折半插入排序运行时间:"<<bittime<<"秒"<<endl;
		        cout<<endl;
    			 break;
			}
    		
    		case 3:{
    			readData(num);
    			double shittime;
    			 int dk;
				 cout<<"请输入首次希尔值:";
				 cin>>dk; 
				start=clock();
    			 ShellInsertSort(num,dk);
    			end=clock();
    			shittime=double(end-start);
    			 shittime=shittime/CLOCKS_PER_SEC; 
    		    cout<<"希尔排序结果:"<<endl;
    		    FILE * f3=fopen("data3.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f3,"%d ",num[i]);
                          }
                  fclose(f3);
    			 printData(num);
    			 cout<<"希尔排序运行时间:"<<shittime<<"秒"<<endl;
    			cout<<endl;
    			 break;
			}
    		
			case 4:{
				readData(num);
				double bitime;
				start=clock();
    			BubbleSort(num);
    			end=clock();
    			bitime=double(end-start);
    			 bitime=bitime/CLOCKS_PER_SEC;
    			 FILE * f4=fopen("data4.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f4,"%d ",num[i]);
                          }
                  fclose(f4);
    			 printData(num);
    			 cout<<"冒泡排序运行时间:"<<bitime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}	
			case 5:{
				readData(num);
				double qstime;
				start=clock();
    			 QuickSort(num,0,N-1);
    			end=clock();
    		    qstime=double(end-start);
    			 qstime=qstime/CLOCKS_PER_SEC;
    			 cout<<"快速排序结果:"<<endl;
    			 FILE * f5=fopen("data5.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f5,"%d ",num[i]);
                          }
                  fclose(f5);
    			 printData(num);
    			 cout<<"快速排序运行时间:"<<qstime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}	
			case 6:{
				readData(num);
				double sstime;
				 
    			 SelectSort(num);
    			end=clock();
    		    sstime=double(end-start);
    			 sstime=sstime/CLOCKS_PER_SEC;
    			 cout<<"选择排序结果:"<<endl;
    			 FILE * f6=fopen("data6.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f6,"%d ",num[i]);
                          }
                  fclose(f6);
    			 printData(num);
    			 cout<<"选择排序运行时间:"<<sstime<<"秒"<<endl;
    			 cout<<endl;
    			 break;
			}
			
    		case 7:{
    			readData(num);
    			 double hstime;
				start=clock();
    		    Heapsort(num);
    			end=clock();
    		    hstime=double(end-start);
    			 hstime=hstime/CLOCKS_PER_SEC;
    			 cout<<"大根堆排序结果:"<<endl;
    			 FILE * f7=fopen("data7.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f7,"%d",num[i]);
                          }
                  fclose(f7);
    			 printData(num);
    			 cout<<"大根堆排序运行时间:"<<hstime<<"秒"<<endl;
    		     cout<<endl;
    			 break;
			}
    		
    		case 8:{
				readData(num);
    			double mstime;
				start=clock();
    		     Mergesort(num,0,N-1);
    			end=clock();
    		    mstime=double(end-start);
    			 mstime=mstime/CLOCKS_PER_SEC;
    			 cout<<"归并排序结果:"<<endl;
    			 FILE * f8=fopen("data8.txt","w");
                     for(int i=0;i<N;i++)
                   {
                  fprintf(f8,"%d ",num[i]);
                          }
                  fclose(f8);
    			 printData(num);
    			 cout<<endl;
    			 cout<<"归并排序运行时间:"<<mstime<<"秒"<<endl;
    			 break;
			}
    		
		}
    } 
} 

 int main(){
 	cout<<"请输入随机数个数:"<<endl;
 	cin>>N;
 	writeData(); 
    int data[N];
    readData(data);
    cout<<"随机产生的N个数据如下:"<<endl ;
    printData(data);
    menu();
 }
 

希望各位大佬不吝赐教,做一个开心的代码狗。

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值