数据结构实验——排序算法实验

排序算法

所包含的排序算法/插入0 希尔1 冒泡2 快排3 选择4 堆5 归并6 基数7/

// 排序实验
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <memory.h>

#define STR_LEN 60000//定义随机输出的数据规模。

typedef struct  {
int shuju, count; 
}point;//每个数据的结构

int count=0;
int n=0; 
point data[1000000]; 
clock_t start, finish;   //定义第计数器
double Total_time;    //定义一个double类型的变量,用于存储时间单位
long long times[8];
double timi[10];

/*插入0  希尔1  冒泡2  快排3  选择4  堆5  归并6  基数7*/
void InsertSort(point *num, int n);//0
void ShellSort(point *num, int n);//1
void BubbleSort(point *num);//2
void QuickSort(point *num, int left, int right);//3
int AdjustAarry(point *num, int left, int right);
void SelectSort(point *num, int n) ;//4
void HeapSort(point *num, int n);//5
void AdjustHeap(point *num, int start, int end);
void MergeSort(point *num, int left, int right);//6
void merge(point *num, int left, int mid, int right);
void RadixSort(point *num, int n);//7
void Creatdata();
void readdata() ;
void judge(point *num,int n);
void write(int i) ;
void writetime();
void print(int count);

int main() 
{ 
	srand((int)time(0));
	count=STR_LEN;
    n=count;
	for(int i = 0; i < 10; i++){
		memset(times,0,sizeof(times));
		Creatdata();
		readdata();
		printf("数据规模%d,第%d组\n",count,i+1);  print(count);
		InsertSort(data,count);  judge(data,count);
		readdata();		
		ShellSort(data,count);   
		judge(data,count);
		readdata();		
		BubbleSort(data);  
		judge(data,count);
		readdata();		
		start = clock();   //获取开始时间  
		QuickSort(data,1,count);  
		finish = clock();  //获取结束时间
        Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
        printf("QuickSort:%.3fms。\n",Total_time);
        timi[3]=Total_time;
		judge(data,count);
		readdata();		
		SelectSort(data,count); 
		judge(data,count);
		readdata();		
		HeapSort(data,count);   
		judge(data,count);		
		readdata();	
		start = clock();   //获取开始时间  
		MergeSort(data,1,count);
		finish = clock();  //获取结束时间
        Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
        printf("MergeSort:%.3fms。\n",Total_time);
        judge(data,count);
        timi[6]=Total_time;	   	
		readdata();		
		RadixSort(data,count);  
		judge(data,count);
        write(i); 
        writetime();
        printf("Sorted:");
        print(count);
        printf("\n"); 	
	}	
}

void InsertSort(point *num, int n) { //0:直接插入排序,从小到大 ,下标1开始有效
	start = clock();   //获取开始时间  
	int i,j;
	for(i = 2; i <= n; i++) {
		times[0]++;
		if(num[i].shuju< num[i-1].shuju) {			
			num[0].shuju = num[i].shuju;
			for(j = i-1; num[j].shuju > num[0].shuju; j--) {
				times[0]++;
				num[j+1].shuju = num[j].shuju;
			}
		}
	}
	finish = clock();  //获取结束时间
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("InsertSort:%.3fms\n",Total_time);
    timi[0]=Total_time;
    
}

void ShellSort(point *num, int n) { //1:希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
	
	start = clock();   //获取开始时间  
	int k, s,d,i,j;
	for(k = log(n)/log(2); k >= 1; k--) {
		d = pow(2,k)-1;
		for(s = 1; s <=  d; s++) {
			for(i = s+d; i <= n; i+=d) {				
				times[1]++;
				if(num[i].shuju < num[i-d].shuju) {
					num[0].shuju = num[i].shuju;
					num[0].count = num[i].count;
					for(j = i-d; j > 0 && num[j].shuju > num[0].shuju; j-=d) {
						times[1]++;
						num[j+d].shuju = num[j].shuju;
						num[j+d].count = num[j].count;
					}
					num[j+d].shuju = num[0].shuju;
					num[j+d].count = num[0].count;
				}
			}

		}
	}
	
	finish = clock();  //获取结束时间
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("ShellSort:%.3fms。\n",Total_time);
    timi[1]=Total_time;
    
}

void BubbleSort(point *num) { //2:冒泡排序,从小到大,起始下标1
    start = clock();   //获取开始时间  
	int i,j, t ,tt, f = 1;
	for(i = 1; i <= n; i++) {
		for(j = 1; j < n-i; j ++) {
			times[2]++;
			if(num[j].shuju>num[j+1].shuju) {
				t = num[j].shuju;
				tt=num[j].count;
				num[j].shuju = num[j+1].shuju;
				num[j].count= num[j+1].count;
				num[j+1].shuju = t;
				num[j+1].count = tt;
				f = 0;
			}
		}
		if(f) {
			break;
		}
	}
	finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("BubbleSort:%.3fms。\n",Total_time);
	
    timi[2]=Total_time;
	
} 

int AdjustAarry(point *num, int left, int right) {//对已经选好中点的序列进行排序调整
	
	int i = left,j = right;
	num[0].shuju = num[left].shuju;
	num[0].count = num[left].count;
	while(i<j) {
		while(i<j && num[j].shuju > num[0].shuju) {
			times[3]++; 
			j--;
		}
		if(i<j) {
			num[i].shuju = num[j].shuju;
			num[i].count = num[j].count;
			i++;
		}
		while(i<j && num[i].shuju < num[0].shuju) {
			times[3]++;
			i++;
		}
		if(i<j) {
			num[j].shuju = num[i].shuju;
			num[j].count = num[i].count;
			j--;
		}
	}
	num[i].shuju = num[0].shuju;
	num[i].count = num[0].count;
	return i;
}


void QuickSort(point *num, int left, int right) { //3:快速排序,从小到大,起始下标1

	int m;
	if(left < right) {
		m = AdjustAarry(num, left, right);
		QuickSort(num, left, m-1);
		QuickSort(num, m+1, right);
	}
}



void SelectSort(point *num, int n) {//4:选择排序 
	start = clock();   //获取开始时间  
	int i,j, t;
	for(i = 1; i < n ; i++) {
		t = i;
		for(j = i+1; j <= n; j++) {
			times[4]++; 
			if(num[t].shuju > num[j].shuju) {
				t = j;
			}
		}
		if(i != t) {
			num[0].shuju = num[i].shuju;
			num[0].count = num[i].count;
			num[i].shuju = num[t].shuju;
			num[i].count = num[t].count;
			num[t].shuju = num[0].shuju;
			num[t].count = num[0].count;
			
		}
	}
     finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("SelectSort:%.3f。\n",Total_time);	
    timi[4]=Total_time;
    
}

void AdjustHeap(point *num, int start, int end) {
	int dad = start, son = 2*dad;
	while(son <= end) {
		times[5]++; 
		if(son+1 <= end && num[son].shuju < num[son+1].shuju) {
			son++;
		}
		times[5]++; 
		if(num[dad].shuju < num[son].shuju) {			
			num[0].shuju = num[dad].shuju;
			num[0].count = num[dad].count;
			
			num[dad].shuju = num[son].shuju;
			num[dad].count = num[son].count;
			
			num[son].shuju = num[0].shuju;
			num[son].count = num[0].count;
			
			dad = son;
			son = 2*dad;
		} else {
			return;
		}
	}
}

void HeapSort(point *num, int n) {//5:堆排序 
    start = clock();   //获取开始时间  
	int i = n;
	while(i > 0) {
		AdjustHeap(num, i, n);
		i--;
	}
	for(i = 1; i < n; i++) {
		num[0].shuju = num[1].shuju;
		num[0].count = num[1].count;
		
		num[1].shuju = num[n+1-i].shuju;
		num[1].count = num[n+1-i].count;
		
		num[n+1-i].shuju = num[0].shuju;
		num[n+1-i].count = num[0].count;
		AdjustHeap(num,1, n-i);
	}
	
     finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("HeapSort:%.3fms。\n",Total_time);
	timi[5]=Total_time;	
}


void MergeSort(point *num, int left, int right) { //6:归并排序,从小到大,递归   	
	int mid;
	if(left < right) {
		mid = (left + right) / 2;
		MergeSort(num, left,mid);
		MergeSort(num, mid+1, right);
		merge(num, left, mid, right);
	}
    
}

void merge(point *num, int left, int mid, int right) { //归并两组有序数。从小的到大
	int i = left, j = mid+1,  t = 0;
	//int c = ;
	point pt =(point *) malloc(sizeof(int) * (right - left + 1));
	while(i <= mid && j <= right) {
		times[6]++;
		if(num[i].shuju > num[j].shuju) {			 
			pt[t].shuju= num[j].shuju;
			pt[t].count= num[j].count;
			j++;
		} else {
			pt[t].shuju = num[i].shuju;
			pt[t].count= num[i].count;
			i++;
		}
		t++;
	}
	while(i <= mid) {
		pt[t].shuju = num[i].shuju;
		pt[t].count= num[i].count;
		i++;
		t++;
	}
	while(j <= right) {
		pt[t].shuju = num[j].shuju;
		pt[t].count= num[j].count;
		j++;
		t++;
	}
	t = 0;
	i = left;
	while(i <= right) {
		num[i].shuju = pt[t].shuju;
		num[i].count = pt[t].count;
		i++;
		t++;
	}
}


void RadixSort(point *num, int n) { // 基数排序, 从小到大,下标从1开始
     start = clock();   //获取开始时间 
	int max = num[1].shuju, i,j,k, count = 0, *temp[10];
	for(i = 2; i <= n; i++) { //找最大数
		if(max < num[i].shuju) {
			max = num[i].shuju;
		}
	}

	while(max) { //确定最大位数
		count++;
		max = max/10;
	}

	for(i = 0; i < 10; i++) {
		temp[i] = (int *)malloc(sizeof(int) * (n+1));
		temp[i][0] = 0;
	}
	max = 1;

	while(count--) {
		for(i = 1; i <= n; i++) { //分桶 
			temp[num[i].shuju/max%10][0]++;
			temp[num[i].shuju/max%10][temp[num[i].shuju/max%10][0]] = num[i].shuju;

		}

		k = 1;
		for(i = 0; i < 10; i++) { //合并
			for(j = 1; j <= temp[i][0]; j++) {
				num[k++].shuju = temp[i][j];
			}
			temp[i][0] = 0;
		}
		max *= 10;
	}
	for(i = 0; i < 10; i++) {
		free(temp[i]);
	}	
	 finish = clock();  //获取结束时间
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("RadixSort:%.3fms。\n",Total_time);
	timi[7]=Total_time;
}

/*
void Creatdata(int n) // 随机生成一定规模的数据写进相关文件
{
	
	FILE *fp=fopen("data.txt","w");
    fprintf(fp,"%d\n",n);
	int t;
	for (int i=0;i<n-1;i++)
	{
		
		if(i==n-2) {
			    t=rand()%10000+1;
			   	fprintf(fp,"%d  ",t);
		}
    	else	fprintf(fp,"%d  ",rand()% 10000 +1);
		
	}
	fprintf(fp,"%d\n",t);	
	fclose(fp);
	
}
*/

void Creatdata()
{
	FILE* creat = fopen("data.txt", "w");
	FILE* c2 = fopen("log.txt", "a");

	int str[STR_LEN + 1] = { 0 };
    fprintf(creat,"%d\n",STR_LEN);
	int i;

	for (i = 0; i < STR_LEN; i++)
	{
        int lenth;
	    srand(time(NULL));//通过时间函数设置随机数种子,使得每次运行结果随机。
	    do { lenth = rand() % STR_LEN; } while (lenth < 3);
		str[i] = rand() % lenth + 1;
        fprintf(creat, "%d ", str[i]);
	}
	fclose(creat);
	fclose(c2);
}

void Readdata()  // 从文件中读取数据 放进数组a里面 
{
	FILE *fp=fopen("data.txt","r");
	int n=0;
	fscanf(fp,"%d",&n);
	
	memset(data,0,sizeof(data));
	
	for (int i=1;i<=n;i++)
	{
		fscanf(fp,"%d",&data[i].shuju);
	    data[i].count=i;
	}

	fclose(fp);
	
	
}

void judge(point *num,int n)   // 判断稳定不稳定 
{
	for (int i=1;i<=n-1;i++)
	{
		if (num[i].shuju==num[i+1].shuju&&num[i].count>num[i+1].count)
		{
			printf("不稳定!\n");
			return ;
		}
	}
	printf("稳定!\n");
}
void write(int i)    // 写比较次数进结果文件 
{
		if (i==0) 
	{
		char s[10]="w";
		FILE *fp = fopen("result.txt",s);
	for(int i1 = 0; i1 < 7; i1++)
		fprintf(fp,"%d ",times[i1]);
	fprintf(fp,"\n");
	fclose(fp);	
	}
	
	else 	{
	char s[10]="a";	
		FILE *fp = fopen("result.txt",s);
	for(int i1 = 0; i1< 7; i1++)
		fprintf(fp,"%d ",times[i1]);	
    	fprintf(fp,"\n");
	    fclose(fp);		
		
	}

}

void writetime()   //写时间进文件 
{
	FILE *fp = fopen("result.txt","a");
	for(int i1 = 0; i1 < 8; i1++)
		fprintf(fp,"%fms ",timi[i1]);
        fprintf(fp,"\n");	
	fclose(fp);	
	
} 

void print(int count)    //把初始序列与最终序列打印到屏幕上
{
	for (int j=1;j<=count;j++)
		printf("%d ",data[j]);
		printf("\n");  
} 


// 排序实验
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <memory.h>
typedef struct  {
  int shuju, count; 
}point;
int count=0;
int n=0; 
point data[1000000]; 
clock_t start, finish;   //定义第计数器
double Total_time;    //定义一个double类型的变量,用于存储时间单位
long long times[8];
double timi[10];
/*插入0  希尔1  冒泡2 快排3  选择4  堆5  归并6*/
void InsertSort(point *num, int n) { //直接插入排序,从小到大 ,下标1开始有效
	start = clock();   //获取开始时间  
	int i,j;
	for(i = 2; i <= n; i++) {
		times[0]++;
		if(num[i].shuju< num[i-1].shuju) {			
			num[0].shuju = num[i].shuju;
			for(j = i-1; num[j].shuju > num[0].shuju; j--) {
				times[0]++;
				num[j+1].shuju = num[j].shuju;
			}
		}
	}
	finish = clock();  //获取结束时间
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("插入使用了%f毫秒。\n",Total_time);
    timi[0]=Total_time;
    
}

void ShellSort(point *num, int n) { //希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
	
	start = clock();   //获取开始时间  
	int k, s,d,i,j;
	for(k = log(n)/log(2); k >= 1; k--) {
		d = pow(2,k)-1;

		for(s = 1; s <=  d; s++) {
			for(i = s+d; i <= n; i+=d) {				
				times[1]++;
				if(num[i].shuju < num[i-d].shuju) {
					num[0].shuju = num[i].shuju;
					num[0].count = num[i].count;
					for(j = i-d; j > 0 && num[j].shuju > num[0].shuju; j-=d) {
						times[1]++;
						num[j+d].shuju = num[j].shuju;
						num[j+d].count = num[j].count;
					}
					num[j+d].shuju = num[0].shuju;
					num[j+d].count = num[0].count;
				}
			}

		}
	}
	
	  finish = clock();  //获取结束时间
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("希尔使用了%f毫秒。\n",Total_time);
     timi[1]=Total_time;
    
}


void BubbleSort(point *num) { //冒泡排序,从小到大,起始下标1
    start = clock();   //获取开始时间  
	int i,j, t ,tt, f = 1;
	for(i = 1; i <= n; i++) {
		for(j = 1; j < n-i; j ++) {
			times[2]++;
			if(num[j].shuju>num[j+1].shuju) {
				t = num[j].shuju;
				tt=num[j].count;
				num[j].shuju = num[j+1].shuju;
				num[j].count= num[j+1].count;
				num[j+1].shuju = t;
				num[j+1].count = tt;
				f = 0;
			}
		}
		if(f) {
			break;
		}
	}
	finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("冒泡使用了%f毫秒。\n",Total_time);
	
    timi[2]=Total_time;
	
} 


int AdjustAarry(point *num, int left, int right) {
	
	int i = left,j = right;
	num[0].shuju = num[left].shuju;
	num[0].count = num[left].count;
	while(i<j) {
		while(i<j && num[j].shuju > num[0].shuju) {
			times[3]++; 
			j--;
		}
		if(i<j) {
			num[i].shuju = num[j].shuju;
			num[i].count = num[j].count;
			i++;
		}
		while(i<j && num[i].shuju < num[0].shuju) {
			times[3]++;
			i++;
		}
		if(i<j) {
			num[j].shuju = num[i].shuju;
			num[j].count = num[i].count;
			j--;
		}
	}
	num[i].shuju = num[0].shuju;
	num[i].count = num[0].count;
	return i;
}


void QuickSort(point *num, int left, int right) { //快速排序,从小到大,起始下标1

	int m;
	if(left < right) {
		m = AdjustAarry(num, left, right);
		QuickSort(num, left, m-1);
		QuickSort(num, m+1, right);
	}
  	
}



void SelectSort(point *num, int n) {//选择排序 
	start = clock();   //获取开始时间  
	int i,j, t;
	for(i = 1; i < n ; i++) {
		t = i;
		for(j = i+1; j <= n; j++) {
			times[4]++; 
			if(num[t].shuju > num[j].shuju) {
				t = j;
			}
		}
		if(i != t) {
			num[0].shuju = num[i].shuju;
			num[0].count = num[i].count;
			num[i].shuju = num[t].shuju;
			num[i].count = num[t].count;
			num[t].shuju = num[0].shuju;
			num[t].count = num[0].count;
			
		}
	}
     finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("选择使用了%f毫秒。\n",Total_time);	
    timi[4]=Total_time;
    
}

void AdjustHeap(point *num, int start, int end) {
	int dad = start, son = 2*dad;
	while(son <= end) {
		times[5]++; 
		if(son+1 <= end && num[son].shuju < num[son+1].shuju) {
			son++;
		}
		times[5]++; 
		if(num[dad].shuju < num[son].shuju) {			
			num[0].shuju = num[dad].shuju;
			num[0].count = num[dad].count;
			
			num[dad].shuju = num[son].shuju;
			num[dad].count = num[son].count;
			
			num[son].shuju = num[0].shuju;
			num[son].count = num[0].count;
			
			dad = son;
			son = 2*dad;
		} else {
			return;
		}
	}
}

void HeapSort(point *num, int n) {//堆排序 
    start = clock();   //获取开始时间  
	int i = n;
	while(i > 0) {
		AdjustHeap(num, i, n);
		i--;
	}
	for(i = 1; i < n; i++) {
		num[0].shuju = num[1].shuju;
		num[0].count = num[1].count;
		
		num[1].shuju = num[n+1-i].shuju;
		num[1].count = num[n+1-i].count;
		
		num[n+1-i].shuju = num[0].shuju;
		num[n+1-i].count = num[0].count;
		AdjustHeap(num,1, n-i);
	}
	
     finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("堆排序使用了%f毫秒。\n",Total_time);
	 timi[5]=Total_time;	

}

void merge(point *num, int left, int mid, int right) { //归并两组有序数。从小的到大
	int i = left, j = mid+1,  t = 0;
	point pt[right - left +1];

	while(i <= mid && j <= right) {
		times[6]++;
		if(num[i].shuju > num[j].shuju) {			 
			pt[t].shuju= num[j].shuju;
			pt[t].count= num[j].count;
			j++;
		} else {
			pt[t].shuju = num[i].shuju;
			pt[t].count= num[i].count;
			i++;
		}
		t++;
	}
	while(i <= mid) {
		pt[t].shuju = num[i].shuju;
		pt[t].count= num[i].count;
		i++;
		t++;
	}
	while(j <= right) {
		pt[t].shuju = num[j].shuju;
		pt[t].count= num[j].count;
		j++;
		t++;
	}
	t = 0;
	i = left;
	while(i <= right) {
		num[i].shuju = pt[t].shuju;
		num[i].count = pt[t].count;
		i++;
		t++;
	}

}

void MergeSort(point *num, int left, int right) { //归并排序,从小到大,递归
   	
	int mid;
	if(left < right) {
		mid = (left + right) / 2;
		MergeSort(num, left,mid);
		MergeSort(num, mid+1, right);
		merge(num, left, mid, right);
	}
    
}


void RadixSort(point *num, int n) { // 基数排序, 从小到大,下标从1开始
     start = clock();   //获取开始时间 
	int max = num[1].shuju, i,j,k, count = 0, *temp[10];
	for(i = 2; i <= n; i++) { //找最大数
		if(max < num[i].shuju) {
			max = num[i].shuju;
		}
	}

	while(max) { //确定最大位数
		count++;
		max = max/10;
	}

	for(i = 0; i < 10; i++) {
		temp[i] = (int *)malloc(sizeof(int) * (n+1));
		temp[i][0] = 0;
	}
	max = 1;

	while(count--) {
		for(i = 1; i <= n; i++) { //分桶 
			temp[num[i].shuju/max%10][0]++;
			temp[num[i].shuju/max%10][temp[num[i].shuju/max%10][0]] = num[i].shuju;

		}

		k = 1;
		for(i = 0; i < 10; i++) { //合并
			for(j = 1; j <= temp[i][0]; j++) {
				num[k++].shuju = temp[i][j];

			}
			temp[i][0] = 0;
		}

		max *= 10;
	}
	for(i = 0; i < 10; i++) {
		free(temp[i]);
	}
	
	 finish = clock();  //获取结束时间

    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
    printf("基数使用了%f毫秒。\n",Total_time);
	 timi[7]=Total_time;
}

void Creatdata(int n) // 随机生成一定规模的数据写进相关文件
{
	
	FILE *fp=fopen("data.txt","w");
    fprintf(fp,"%d\n",n);
	int t;
	 for (int i=0;i<n-1;i++)
	{
		
		if(i==n-2) {
			     t=rand()%100+1;
			   	fprintf(fp,"%d  ",t);
		}
    	else	fprintf(fp,"%d  ",rand()%100+1);
		
	}
	fprintf(fp,"%d\n",t);	
	fclose(fp);
	
}


void readdata()  // 从文件中读取数据 放进数组a里面 
{
	FILE *fp=fopen("data.txt","r");
	int n=0;
	fscanf(fp,"%d",&n);
	
	memset(data,0,sizeof(data));
	
	for (int i=1;i<=n;i++)
	{
		fscanf(fp,"%d",&data[i].shuju);
	    data[i].count=i;
	}

	fclose(fp);
	
	
}

void judge(point *num,int n)   // 判断稳定不稳定 
{
	for (int i=1;i<=n-1;i++)
	{
		if (num[i].shuju==num[i+1].shuju&&num[i].count>num[i+1].count)
		 {
		 	printf("不稳定!\n");
		 	return ;
		 }
	}
	printf("稳定!\n");
}
void write(int i)    // 写比较次数进结果文件 
{
		if (i==0) 
	{
		char s[10]="w";
		FILE *fp = fopen("result.txt",s);
	for(int i1 = 0; i1 < 7; i1++)
		fprintf(fp,"%d ",times[i1]);
	fprintf(fp,"\n");
	fclose(fp);	
	}
	
	else 	{
	char s[10]="a";	
		FILE *fp = fopen("result.txt",s);
	for(int i1 = 0; i1< 7; i1++)
		fprintf(fp,"%d ",times[i1]);	
    	fprintf(fp,"\n");
	    fclose(fp);		
		
	}

}

void writetime()   //写时间进文件 
{
	FILE *fp = fopen("result.txt","a");
	for(int i1 = 0; i1 < 8; i1++)
		fprintf(fp,"%fms ",timi[i1]);
        fprintf(fp,"\n");	
	fclose(fp);	
	
 } 
 
void print(int count)    //把初始序列与最终序列打印到屏幕上
{
 	for (int j=1;j<=count;j++)
		  printf("%d ",data[j]);
		  printf("\n");  
} 
int main() 
{ 
	srand((int)time(0));
	printf("请选择数据规模:");
	scanf("%d",&count); 
     n=count;
	for(int i = 0; i < 10; i++){
		
		memset(times,0,sizeof(times));
		Creatdata(count);
		
		readdata();
		printf("数据规模%d,第%d组\n",count,i+1);  print(count);
		InsertSort(data,count);  judge(data,count);
	     
		readdata();		ShellSort(data,count);   judge(data,count);
		readdata();		BubbleSort(data);  judge(data,count);
		readdata();		
		
		start = clock();   //获取开始时间  
		QuickSort(data,1,count);  
		finish = clock();  //获取结束时间
        Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
        printf("快排使用了%f毫秒。\n",Total_time);
         timi[3]=Total_time;
		judge(data,count);
		
		readdata();		SelectSort(data,count); judge(data,count);
		readdata();		HeapSort(data,count);   judge(data,count);
	
				
		readdata();	
		start = clock();   //获取开始时间  
		MergeSort(data,1,count);
		finish = clock();  //获取结束时间
        Total_time = (double)(finish - start) / CLOCKS_PER_SEC;   //单位换算,换算成毫秒
        printf("归并使用了%f毫秒。\n",Total_time);
        judge(data,count);
         timi[6]=Total_time;
       
	   	
		readdata();		RadixSort(data,count);  judge(data,count);
         write(i); 
         writetime();
         printf("排序后:");
         print(count);
         printf("\n"); 
	
	}
	

	
}

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

long times[8];
/*插入0希尔1冒泡2 快排3 选择4 堆5 归并6*/

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void InsertSort(int num[], int n) { //直接插入排序,从小到大 ,下标1开始有效
	int i,j;
	for(i = 2; i <= n; i++) {
		times[0]++;
		if(num[i] < num[i-1]) {			
			num[0] = num[i];
			for(j = i-1; num[j] > num[0]; j--) {
				times[0]++;
				num[j+1] = num[j];
			}
		}
	}
}

void ShellSort(int num[], int n) { //希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
	int k, s,d,i,j;
	for(k = log(n)/log(2); k >= 1; k--) {
		d = pow(2,k)-1;
		printf("\nd = %5d,k = %d\n",d,k);
		for(s = 1; s <=  d; s++) {
			for(i = s+d; i <= n; i+=d) {				
				times[1]++;
				if(num[i] < num[i-d]) {
					num[0] = num[i];
					for(j = i-d; j > 0 && num[j] > num[0]; j-=d) {
						times[1]++;
						num[j+d] = num[j];
					}
					num[j+d] = num[0];
				}
			}

		}
	}
}

void BubbleSort(int num[], int n) { //冒泡排序,从小到大,起始下标1
	int i,j, t , f = 1;
	for(i = 1; i <= n; i++) {
		for(j = 1; j < n-i; j ++) {
			times[2]++;
			if(num[j] >num[j+1]) {
				t = num[j];
				num[j] = num[j+1];
				num[j+1] = t;
				f = 0;
			}
		}
		if(f) {
			break;
		}
	}
}

int AdjustAarry(int num[], int left, int right) {
	int i = left,j = right;
	num[0] = num[left];
	while(i<j) {
		while(i<j && num[j] > num[0]) {
			times[3]++; 
			j--;
		}
		if(i<j) {
			num[i] = num[j];
			i++;
		}
		while(i<j && num[i] < num[0]) {
			times[3]++;
			i++;
		}
		if(i<j) {
			num[j] = num[i];
			j--;
		}
	}
	num[i] = num[0];
	return i;
}


void QuickSort(int num[], int left, int right) { //快速排序,从小到大,起始下标1
	int m;
	if(left < right) {
		m = AdjustAarry(num, left, right);
		QuickSort(num, left, m-1);
		QuickSort(num, m+1, right);
	}
}

void SelectSort(int num[], int n) {//选择排序 
	int i,j, t;
	for(i = 1; i < n ; i++) {
		t = i;
		for(j = i+1; j <= n; j++) {
			times[4]++; 
			if(num[t] > num[j]) {
				t = j;
			}
		}
		if(i != t) {
			num[0] = num[i];
			num[i] = num[t];
			num[t] = num[0];
		}
	}
}

void AdjustHeap(int num[], int start, int end) {
	int dad = start, son = 2*dad;
	while(son <= end) {
		times[5]++; 
		if(son+1 <= end && num[son] < num[son+1]) {
			son++;
		}
		times[5]++; 
		if(num[dad] < num[son]) {			
			num[0] = num[dad];
			num[dad] = num[son];
			num[son] = num[0];
			dad = son;
			son = 2*dad;
		} else {
			return;
		}
	}
}

void HeapSort(int num[], int n) {//堆排序 
	int i = n;
	while(i > 0) {
		AdjustHeap(num, i, n);
		i--;
	}
	for(i = 1; i < n; i++) {
		num[0] = num[1];
		num[1] = num[n+1-i];
		num[n+1-i] = num[0];
		AdjustHeap(num,1, n-i);
	}

}

void merge(int num[], int left, int mid, int right) { //归并两组有序数。从小的到大
	int i = left, j = mid+1, *pt = NULL, t = 0;
	pt = (int *)malloc(sizeof(int) * (right - left +1));
	while(i <= mid && j <= right) {
		times[6]++;
		if(num[i] > num[j]) {			 
			pt[t] = num[j];
			j++;
		} else {
			pt[t] = num[i];
			i++;
		}
		t++;
	}
	while(i <= mid) {
		pt[t] = num[i];
		i++;
		t++;
	}
	while(j <= right) {
		pt[t] = num[j];
		j++;
		t++;
	}
	t = 0;
	i = left;
	while(i <= right) {
		num[i] = pt[t];
		i++;
		t++;
	}
	free(pt);
}

void MergeSort(int num[], int left, int right) { //归并排序,从小到大,递归
	int mid;
	if(left < right) {
		mid = (left + right) / 2;
		MergeSort(num, left,mid);
		MergeSort(num, mid+1, right);
		merge(num, left, mid, right);
	}

}

void RadixSort(int num[], int n) { // 基数排序, 从小到大,下标从1开始
	int max = num[1], i,j,k, count = 0, *temp[10];
	for(i = 2; i <= n; i++) { //找最大数
		if(max < num[i]) {
			max = num[i];
		}
	}
	//printf("%d",max);
	while(max) { //确定最大位数
		count++;
		max = max/10;
	}
	//printf("%d",count);
	for(i = 0; i < 10; i++) {
		temp[i] = (int *)malloc(sizeof(int) * (n+1));
		temp[i][0] = 0;
	}
	max = 1;
	while(count--) {
		for(i = 1; i <= n; i++) { //分桶 
			temp[num[i]/max%10][0]++;
			temp[num[i]/max%10][temp[num[i]/max%10][0]] = num[i];
		}
//		for(i = 0; i < 10; i++){//合并
//			printf("%d:",i) ;
//			for(j = 1; j <= temp[i][0]; j++){
//				printf("%5d",temp[i][j]) ;
//			}
//			printf("\n") ;
//		}
		k = 1;
		for(i = 0; i < 10; i++) { //合并
			for(j = 1; j <= temp[i][0]; j++) {
				num[k++] = temp[i][j];
			}
			temp[i][0] = 0;
		}
//		for(i = 1; i <= n; i++){//找最大数
//		printf("%5d", num[i]);
//		}

		max *= 10;
	}
	for(i = 0; i < 10; i++) {
		free(temp[i]);
	}
}

void createdata(int n) {
	FILE *fp;
	int data, i;
	fp = fopen("data.txt","w");
	fprintf(fp,"%d\n",n);
	
	srand((unsigned)time(NULL));
	for(i = 0; i < n; i++) {
		data = rand();
		fprintf(fp,"%d ",data);
	}
	fclose(fp);

}

void readdata(int a[], int n){
	FILE *fp;
	int fn, i;
	fp = fopen("data.txt","r");
	fscanf(fp,"%d",&fn);
	if(fn > n){
		fn = n;
	}
	for(i = 1; i <= fn; i++){
		fscanf(fp,"%d",a+i);
	}
	fclose(fp);
}

int main(int argc, char *argv[]) {
	int count = 60, i, data[101];
	FILE *fp; 
	//createdata(count);
	for(i = 0; i < 10; i++){
		createdata(count);
		readdata(data, 100);		InsertSort(data,count);
		readdata(data, 100);		ShellSort(data,count);
		readdata(data, 100);		BubbleSort(data,count);
		readdata(data, 100);		QuickSort(data,1,count);
		readdata(data, 100);		SelectSort(data,count);
		readdata(data, 100);		HeapSort(data,count);		
		readdata(data, 100);		MergeSort(data,1,count);
		readdata(data, 100);		RadixSort(data,count);
	}
	fp = fopen("result.txt","w");
	for(i = 0; i < 7; i++){
		fprintf(fp,"%d ",times[i]);
	}
	fclose(fp);
		
	/*int x[12] = {0,55,78,1,66,4,77,5,9,88,79,82},i;
	0 	1	82	4	55 5	66	77	78 88	9 79
	0 1 4 5 9	55	66	77 78 79	82 88
	
	RadixSort(x, 11);
	for(i = 1; i < 12; i++) {
		printf("%5d",x[i]);
	}
	printf("\n");
	//	x = log(20)/log(2);
	//	printf("%d",x);
	*/
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值