核心代码
bubble-sort
#include <stdio.h>
using namespace std;
#define MAXN 10000000
//冒泡排序,第一次上机作业
void bubblesort(int a[],int n){
int tmp;
for (int i=0;i<n-1;i++){
for (int j=0;j+i+1<n;j++) {
if (a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
return;
}
int n;
int a[MAXN];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
bubblesort(a,n);
for(int i=0;i<n;i++)printf("%d ",a[i]);
return 0;
}
get-alot-randnum
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
//这个程序用来生成题中需要的大量的数据集
//这个程序要调用 getrandnum.c中定义的函数
//默认取值范围0x80000000到0x7FFFFFFF (int范围)
extern void f1(FILE *fp,int N,int s,int t);
extern void f2(FILE *fp,int N,int s,int t);
extern void f3(FILE *fp,int N,int s,int t);
extern void super_rand(int s,int t);
int s=0x80000000,t=0x7FFFFFFF;
char filename[17][128];
char tmp1[]="./dataset/randnum-",tmp2[]=".txt",tmp3[10]="100";
char tmp4[]="-increase",tmp5[]="-decrease",tmp6[]="-rand";
//生成的文件名形如 ./dataset/randnum-100-increase.txt
void Solve_Filename(){
for(int i=1;i<=15;i++){
strcpy(filename[i],tmp1);
}
for(int i=2;i<=6;i++){
strcat(filename[1+(i-2)*3],tmp3);
strcat(filename[2+(i-2)*3],tmp3);
strcat(filename[3+(i-2)*3],tmp3);
strcat(filename[1+(i-2)*3],tmp4);
strcat(filename[2+(i-2)*3],tmp5);
strcat(filename[3+(i-2)*3],tmp6);
strcat(filename[1+(i-2)*3],tmp2);
strcat(filename[2+(i-2)*3],tmp2);
strcat(filename[3+(i-2)*3],tmp2);
tmp3[i+1]='0';
tmp3[i+2]='\0';
}
}
int main(){
srand(time(NULL));
Solve_Filename();
int tmp=100;
for(int i=2;i<=6;i++){
FILE *fp1,*fp2,*fp3;
fp1=fopen(filename[1+(i-2)*3],"w");
fp2=fopen(filename[2+(i-2)*3],"w");
fp3=fopen(filename[3+(i-2)*3],"w");
f1(fp1,tmp,s,t);
f2(fp2,tmp,s,t);
f3(fp3,tmp,s,t);
if(fclose(fp1)){
printf("cannot close the file!\n");
exit(0);
}
if(fclose(fp2)){
printf("cannot close the file!\n");
exit(0);
}
if(fclose(fp3)){
printf("cannot close the file!\n");
exit(0);
}
tmp*=10;
}
return 0;
}
getrandnum-1
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
bool cmp(int a, int b){return b < a;}
int n,s,t,type,a[1000000+666];
int main() {
srand(time(0));
cin>>n>>s>>t>>type;
ofstream fout("randnum.txt");
for(int i = 0; i < n; i++)a[i] = s + rand() % (t-s+1);
if(type == 1)sort(a, a + n);
else if(type == 2)sort(a, a + n, cmp);
for(int w = 0; w < n; w++)fout<<a[w]<<" ";
fout.close();
return 0;
}
getrandnum
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//用于生成随机数据
//生成的数据数量是N,范围在[s,t],T是生成数据的类型
//T 1顺序递增 2顺序递减 3随机取值
//这里的递增和递减指的是严格单调递增和严格严格单调递减
int super_rand(int s,int t);
void f1(FILE *fp,int N,int s,int t){
int tmp=super_rand(s,t);
fprintf(fp,"%u ",tmp);
int tmp1;
for(int i=2;i<=N;i++){
tmp1=super_rand(s,t);
while(tmp1<tmp){
tmp1=super_rand(s,t);
}
tmp=tmp1;
fprintf(fp,"%u ",tmp);
}
}
void f2(FILE *fp,int N,int s,int t){
int tmp=super_rand(s,t);
fprintf(fp,"%d ",tmp);
int tmp1;
for(int i=2;i<=N;i++){
tmp1=super_rand(s,t);
while(tmp1>tmp){
tmp1=super_rand(s,t);
}
tmp=tmp1;
fprintf(fp,"%d ",tmp);
}
}
void f3(FILE *fp,int N,int s,int t){
int tmp;
for(int i=1;i<=N;i++){
tmp=super_rand(s,t);
fprintf(fp,"%d ",tmp);
}
}
int super_rand(int s,int t){
//为什么我要写一个super_rand?因为我的库函数中 RAND_MAX仅仅为32767
//rand()生成的数据在[0,RAND_MAX] 这么小的数据,显然是无法很好地获得随机数据
//我通过线性映射,近似地将[0,RAND_MAX]映射到了我们需要的[s,t]
long long randlen=RAND_MAX+1;
long long mylen=(long long)t-(long long)s+1; //由于t-s+1可能超过int的范围,我用long long类型来存
double tmp1=(double)(rand())/randlen;
long long tmp2=mylen*tmp1;
int ans=(int)(tmp2+(long long)s);
return ans;
}
/*
int main(){
int N,s,t,T;
scanf("%d%d%d%d",&N,&s,&t,&T);
srand(time(NULL));
FILE *fp1;
fp1=fopen("get-random-num-result.txt","w");
if(T==1)f1(fp1,N,s,t);
else if(T==2)f2(fp1,N,s,t);
else f3(fp1,N,s,t);
if(fclose(fp1)){
printf("cannot close the file!\n");
exit(0);
}
return 0;
}
*/
insertion-sort
#include<cstdio>
using namespace std;
#define MAXN 10000000
//插入排序,第一次上机作业
int n;
int a[MAXN];
void insertionsort(int arr[],int len){
int tmp,i;
for(int j=1;j<len;j++){
tmp=arr[j];
i=j-1;
while(i>0 && arr[i]>tmp){
arr[i+1]=arr[i];
i--;
}
arr[i+1]=tmp;
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
insertionsort(a,n);
for (int i=0;i<n;i++)printf("%d ",a[i]);
return 0;
}
mergingsort
#include <cstdio>
#include <ctime>
using namespace std;
#define MAXN 10000000
//归并排序,第一次上机作业
int n;
int a[MAXN],b[MAXN];
void merge(int arr[],int left,int mid,int right,int tmp[]){
int i=left;
int j=mid+1;
int t = 0;
while (i<=mid && j<=right){
if (arr[i]<=arr[j]){
tmp[t++]=arr[i++];
}else{
tmp[t++]=arr[j++];
}
}
while(i<=mid)tmp[t++]=arr[i++];
while(j<=right)tmp[t++]=arr[j++];
t=0;
while(left<=right)arr[left++]=tmp[t++];
}
void mergesort(int arr[],int left,int right,int tmp[]){
if (left<right){
int mid=(left+right)/2;
mergesort(arr,left,mid,tmp);
mergesort(arr,mid+1,right,tmp);
merge(arr,left,mid,right,tmp);
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
mergesort(a,0,n-1,b);
for(int i=0;i<n;i++)printf("%d ",a[i]);
return 0;
}
quick-get-random
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <string.h>
using namespace std;
//没办法,这个是用来快速得到需要的数据集而生的
bool cmp(int a, int b){return b < a;}
int s,t,a[1000000+66];
char filename[17][128];
char tmp1[]="./dataset/randnum-",tmp2[]=".txt",tmp3[10]="100";
char tmp4[]="-increase",tmp5[]="-decrease",tmp6[]="-rand";
void Solve_Filename(){
for(int i=1;i<=15;i++){
strcpy(filename[i],tmp1);
}
for(int i=2;i<=6;i++){
strcat(filename[1+(i-2)*3],tmp3);
strcat(filename[2+(i-2)*3],tmp3);
strcat(filename[3+(i-2)*3],tmp3);
strcat(filename[1+(i-2)*3],tmp4);
strcat(filename[2+(i-2)*3],tmp5);
strcat(filename[3+(i-2)*3],tmp6);
strcat(filename[1+(i-2)*3],tmp2);
strcat(filename[2+(i-2)*3],tmp2);
strcat(filename[3+(i-2)*3],tmp2);
tmp3[i+1]='0';
tmp3[i+2]='\0';
}
}
int main() {
s=0,t=0x7FFFFF00;//防止溢出
srand(time(0));
Solve_Filename();
int tmp=100;
for(int i=2;i<=6;i++){
ofstream fout1(filename[1+(i-2)*3]);
ofstream fout2(filename[2+(i-2)*3]);
ofstream fout3(filename[3+(i-2)*3]);
for(int i=0;i<tmp;i++)a[i]=s+rand()%(t-s+1);
for(int i=0;i<tmp;i++)fout3<<a[i]<<" ";
sort(a,a+tmp);
for(int i=0;i<tmp;i++)fout1<<a[i]<<" ";
sort(a,a+tmp,cmp);
for(int i=0;i<tmp;i++)fout2<<a[i]<<" ";
fout1.close();
fout2.close();
fout3.close();
tmp*=10;
}
return 0;
}
test-getans
//要和three-sort.cpp一起编译
// g++ .\test-getans.cpp .\three-sort.cpp -o testcases.exe
#include<iostream>
#include<fstream>
#include<cstdio>
#include<stdio.h>
#include<ctime>
#include<string.h>
using namespace std;
int a[1000000+66],b[1000000+66],n;
char filename[17][128];
char tmp1[]="./dataset/randnum-",tmp2[]=".txt",tmp3[10]="100";
char tmp4[]="-increase",tmp5[]="-decrease",tmp6[]="-rand";
extern void bubblesort(int a[],int n);
extern void mergesort(int arr[],int left,int right,int tmp[]);
extern void insertionsort(int arr[],int len);
void Solve_Filename(){
for(int i=1;i<=15;i++){
strcpy(filename[i],tmp1);
}
for(int i=2;i<=6;i++){
strcat(filename[1+(i-2)*3],tmp3);
strcat(filename[2+(i-2)*3],tmp3);
strcat(filename[3+(i-2)*3],tmp3);
strcat(filename[1+(i-2)*3],tmp4);
strcat(filename[2+(i-2)*3],tmp5);
strcat(filename[3+(i-2)*3],tmp6);
strcat(filename[1+(i-2)*3],tmp2);
strcat(filename[2+(i-2)*3],tmp2);
strcat(filename[3+(i-2)*3],tmp2);
tmp3[i+1]='0';
tmp3[i+2]='\0';
}
}
int main(){
ofstream fout("data.txt");
clock_t startTime, endTime;
Solve_Filename();
int scale=100;
for(int i=2;i<=6;i++){
ifstream fin1(filename[1+(i-2)*3]);
ifstream fin2(filename[2+(i-2)*3]);
ifstream fin3(filename[3+(i-2)*3]);
for(n=0;n<scale;n++)fin1>>a[n];
startTime=clock();
mergesort(a,0,n-1,b);
endTime = clock();
fout<<"Mergesort"<<n<<"Increase"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin1.close();
for(n=0;n<scale;n++)fin2>>a[n];
startTime=clock();
mergesort(a,0,n-1,b);
endTime = clock();
fout<<"Mergesort"<<n<<"Decrease"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin2.close();
for(n=0;n<scale;n++)fin3>>a[n];
startTime=clock();
mergesort(a,0,n-1,b);
endTime = clock();
fout<<"Mergesort"<<n<<"Rand"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin3.close();
scale*=10;
}
scale=100;
for(int i=2;i<=6;i++){
ifstream fin1(filename[1+(i-2)*3]);
ifstream fin2(filename[2+(i-2)*3]);
ifstream fin3(filename[3+(i-2)*3]);
for(n=0;n<scale;n++)fin1>>a[n];
startTime=clock();
insertionsort(a,n);
endTime = clock();
fout<<"Insertsort"<<n<<"Increase"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin1.close();
for(n=0;n<scale;n++)fin2>>a[n];
startTime=clock();
insertionsort(a,n);
endTime = clock();
fout<<"Insertsort"<<n<<"Decrease"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin2.close();
for(n=0;n<scale;n++)fin3>>a[n];
startTime=clock();
insertionsort(a,n);
endTime = clock();
fout<<"Insertsort"<<n<<"Rand"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin3.close();
scale*=10;
}
scale=100;
for(int i=2;i<=6;i++){
ifstream fin1(filename[1+(i-2)*3]);
ifstream fin2(filename[2+(i-2)*3]);
ifstream fin3(filename[3+(i-2)*3]);
for(n=0;n<scale;n++)fin1>>a[n];
startTime=clock();
bubblesort(a,n);
endTime = clock();
fout<<"Bubblesort"<<scale<<"Increase"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin1.close();
for(n=0;n<scale;n++)fin2>>a[n];
startTime=clock();
bubblesort(a,n);
endTime = clock();
fout<<"Bubblesort"<<scale<<"Decrease"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin2.close();
for(n=0;n<scale;n++)fin3>>a[n];
startTime=clock();
bubblesort(a,n);
endTime = clock();
fout<<"Bubblesort"<<scale<<"Rand"<<"RunTime: "<<(1000*( (double) (endTime - startTime) / CLOCKS_PER_SEC))<<"ms"<<endl;
fin3.close();
scale*=10;
}
fout.close();
return 0;
}
three-sort
//写好接口,方便调用
#include <stdio.h>
using namespace std;
void bubblesort(int a[],int n){
int tmp;
for (int i=0;i<n-1;i++){
for (int j=0;j+i+1<n;j++) {
if (a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
return;
}
void merge(int arr[],int left,int mid,int right,int tmp[]){
int i=left;
int j=mid+1;
int t = 0;
while (i<=mid && j<=right){
if (arr[i]<=arr[j]){
tmp[t++]=arr[i++];
}else{
tmp[t++]=arr[j++];
}
}
while(i<=mid)tmp[t++]=arr[i++];
while(j<=right)tmp[t++]=arr[j++];
t=0;
while(left<=right)arr[left++]=tmp[t++];
}
void mergesort(int arr[],int left,int right,int tmp[]){
if (left<right){
int mid=(left+right)/2;
mergesort(arr,left,mid,tmp);
mergesort(arr,mid+1,right,tmp);
merge(arr,left,mid,right,tmp);
}
}
void insertionsort(int arr[],int len){
int tmp,i;
for(int j=1;j<len;j++){
tmp=arr[j];
i=j-1;
while(i>0 && arr[i]>tmp){
arr[i+1]=arr[i];
i--;
}
arr[i+1]=tmp;
}
}