排序算法应用小程序

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

typedef struct node {
	int data;
	char sort_name[50];
}compare;

compare compare_num[8];//存储排序名称和排序的趟数

void swap(int* a, int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}
void bubble_sort(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				swap(&arr[j], &arr[j + 1]);
			}
		}
		compare_num[0].data++;
	}
}

void insrt_sort(int arr[], int n) {
	for (int i = 1; i < n; i++) {
		int key = arr[i];//待排序的那一个元素位置相当于空出来了
		int j = i - 1;//从排好序的最后一个开始比较
		while (j >= 0 && arr[j] > key) {
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = key;
		compare_num[1].data++;
	}
}

int pivot_index(int arr[], int left, int right) {
	int pivot = arr[left];
	int i = left + 1;
	int j = right;
	while (i <= j) {//即使i和j的停止条件是相悖的也要写=,因为只有两个元素的时候i和j相等,仍然需要排序
		while (arr[i] <= pivot && i <= right) {//找打比基准元素大的就停下来(需要写<=,来避免重复元素导致的无限循环)
			i++;
		}
		while (arr[j] >= pivot && j >= left + 1) {//找到比基准元素小的就停下来
			j--;
		}
		if (i < j) {//当i和j交叉时不要交换
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[left], &arr[j]);//j必然指向最后一个小于pivot的元素,前面的if语句会确保
	compare_num[2].data++;
	return j;
}
void quick_sort(int arr[], int left, int right) {
	if (right - left <= 0) return;//只有一个元素的时候不需要排序直接返回;
	int pivot = pivot_index(arr, left, right);
	quick_sort(arr, left, pivot - 1);
	quick_sort(arr, pivot + 1, right);
}

void selection_sort(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		int min_index = i;
		for (int j = i + 1; j < n; j++) {
			if (arr[j] < arr[min_index]) {
				min_index = j;
			}
		}
		swap(&arr[i], &arr[min_index]);
		compare_num[3].data++;
	}
}

void heapify(int arr[], int n, int i) {
	int largest_index = i;
	int left_index = i * 2 + 1;
	int right_index = i * 2 + 2;
	if (arr[left_index] > arr[largest_index] && left_index < n) {
		largest_index = left_index;
	}
	if (arr[right_index] > arr[largest_index] && right_index < n) {
		largest_index = right_index;
	}
	if (largest_index != i) {
		swap(&arr[i], &arr[largest_index]);
		heapify(arr, n, largest_index);
	}
}

void heap_sort(int arr[], int n) {
	for (int i = n / 2 - 1; i >= 0; i--) {//n/2-1是最后一个非叶子节点,因为叶子节点没有子节点,不需要heapify
		heapify(arr, n, i);
	}
	for (int i = n - 1; i >= 0; i--) {
		swap(&arr[0], &arr[i]);
		heapify(arr, i, 0);
		compare_num[4].data++;
	}
}

void merge(int arr[], int l, int m, int r) {
	int n1 = m - l + 1;
	int n2 = r - m;
	int i, j, k;
	int* L = (int*)malloc(sizeof(int) * n1);
	int* R = (int*)malloc(sizeof(int) * n2);
	for (i = 0; i < n1; i++) {
		L[i] = arr[l + i];
	}
	for (j = 0; j < n2; j++) {
		R[j] = arr[m + 1 + j];
	}
	i = 0; j = 0; k = l;//k一定要从l开始,不是从0开始,如果从0开始会导致递归合并的时候覆盖错误
	while (i < n1 && j < n2) {
		if (L[i] < R[j]) {
			arr[k++] = L[i++];
		}
		else {
			arr[k++] = R[j++];
		}
	}
	while (i < n1) {
		arr[k++] = L[i++];
	}
	while (j < n2) {
		arr[k++] = R[j++];
	}
	compare_num[5].data++;
}
void merge_sort(int arr[], int l, int r) {
	if (r - l <= 0) return;//当只有一个元素的时候则返回,不需要合并
	int mid = (l + r) / 2;
	merge_sort(arr, l, mid);
	merge_sort(arr, mid + 1, r);
	merge(arr, l, mid, r);
}

int get_max(int arr[], int n) {
	int max = arr[0];
	for (int i = 1; i < n; i++) {
		if (arr[i] > max) max = arr[i];
	}
	return max;
}
void radix_sort(int arr[], int l, int r) {
	int max_val = get_max(arr, r - l + 1);
	int count = 0;
	while (max_val != 0) {
		max_val /= 10;
		count++;
	}
	int** buckets = (int**)malloc(sizeof(int*) * 10);//根据位数数字0-9,创建10个桶
	int* buckets_size = (int*)malloc(sizeof(int) * 10);//记录每个桶的元素个数来方便赋值到原数组进行排序
	for (int i = 0; i < 10; i++) {
		buckets[i] = (int*)malloc(sizeof(int) * (r - l + 1));
		buckets_size[i] = 0;
	}
	for (int i = 0; i < count; i++) {
		for (int j = l; j <= r; j++) {
			int temp = arr[j];
			temp = temp / (int)pow(10, i);
			int digit = temp % 10;
			buckets[digit][buckets_size[digit]++] = arr[j];
		}
		int index = l;
		for (int k = 0; k < 10; k++) {
			for (int m = 0; m < buckets_size[k]; m++) {//根据每个桶的元素个数来进行赋值
				arr[index++] = buckets[k][m];
			}
			buckets_size[k] = 0;//只需要情况每个桶的元素个数,不需要清空桶内元素
		}
		compare_num[6].data++;
	}
}

void shell_sort(int arr[], int n) {
	int gap;
	for (gap = n / 2; gap > 0; gap /= 2) {
		for (int i = gap; i < n; i++) {//i从gap开始,从第一组开始(插入排序假定第一个数字有序)
			int key = arr[i];
			int j = i - gap;
			while (j >= 0 && arr[j] > key) {
				arr[j + gap] = arr[j];
				j -= gap;//保证了每一个数组都和它那一组的数组进行插入排序,即间隔为gap
			}
			arr[j + gap] = key;
		}
		compare_num[7].data++;
	}
}//希尔排序

void print_arr(int arr[], int l, int r) {
	for (int i = l; i <= r; i++) {
		printf("%d ", arr[i]);
	}
}
void copy_arr(int arr[], int temp[], int n) {
	for (int i = 0; i < n; i++) {
		temp[i] = arr[i];
	}
}
int compare_arrays(int arr1[], int arr2[], int n) {
	for (int i = 0; i < n; i++) {
		if (arr1[i] != arr2[i]) {
			printf("排序错误\n\n");
			return 0;
		}
	}
	printf("排序正确\n\n");
	return 1;
}



int main() {

	int n = 10;//排序的元素数量
	int counts = 5;//测试的回数
	srand(time(NULL));

	int** test_arr = (int**)malloc(sizeof(int*) * 8);
	for (int i = 0; i < 8; i++) {
		test_arr[i] = (int*)malloc(sizeof(int) * n);
	}//初始化测试数组,,选项1中每一次测试前进行了重置

	int* arr = (int*)malloc(sizeof(int) * n);//初始被测试数组,选项1中每一次测试前进行了初始化

	double time[8];//排序时间数组,选项1中每一次测试前进行了初始化
	double start_time = 0;//排序开始时间
	double end_time = 0;//排序结束时间

	int total_compare_num[8];//五次排序的比较次数总和数组
	int average_compare_num[8];//平均比较次数数组
	double total_time[8];//五次排序的时间总和数组
	double average_time[8];//平均时间数组
	for (int i = 0; i < 8; i++) {
		total_compare_num[i] = 0;//初始化比较次数为0
		average_compare_num[i] = 0;//初始化平均比较次数为0
		total_time[i] = 0;//初始化总时间为0
		average_time[i] = 0;//初始化平均时间为0
	}


	int** every_compare_num;//每一次测试的每一个排序算法的趟数数组
	every_compare_num = (int**)malloc(sizeof(int*) * counts);
	double** every_time_num;//每一次测试的每一个排序算法的时间数组
	every_time_num = (double**)malloc(sizeof(double*) * counts);
	for (int i = 0; i < counts; i++) {
		every_compare_num[i] = (int*)malloc(sizeof(int) * 8);
		every_time_num[i] = (double*)malloc(sizeof(double) * 8);
	}


	//初始化compare_num结构体数组
	for (int i = 0; i < 8; i++) {
		compare_num[i].data = 0;//初始化比较次数为0
	}
	strcpy(compare_num[0].sort_name, "冒泡排序");
	strcpy(compare_num[1].sort_name, "插入排序");
	strcpy(compare_num[2].sort_name, "快速排序");
	strcpy(compare_num[3].sort_name, "选择排序");
	strcpy(compare_num[4].sort_name, "堆排序");
	strcpy(compare_num[5].sort_name, "归并排序");
	strcpy(compare_num[6].sort_name, "基数排序");
	strcpy(compare_num[7].sort_name, "希尔排序");


	int choice;
	int flag = 0;
	do {
		printf("\n\n排序算法测试系统\n\n");
		printf("【1】调用八种排序算法进行排序\n");
		printf("【2】获取每一轮测试的八种排序算法的排序次数和时间\n");
		printf("【3】获取八种排序算法的平均排序次数和时间\n");
		printf("【0】退出系统\n");
		printf("请输入选项:");
		scanf("%d", &choice);
		printf("\n");
		if (choice == 1) {
			flag = 1;

			for (int count = 0; count < counts; count++) {

				for (int i = 0; i < 8; i++) {
					time[i] = 0;
				}//重置时间数组,防止影响下一次排序的时间计算结果

				for (int i = 0; i < 8; i++) {
					compare_num[i].data = 0;
				}//重置比较次数为0

				for (int i = 0; i < 8; i++) {
					for (int j = 0; j < n; j++) {
						test_arr[i][j] = 0;
					}
				}//重置测试数组,防止影响下一次排序的结果

				for (int i = 0; i < n; i++) {
					arr[i] = rand();
				}//初始化原始待排序数组

				for (int i = 0; i < 8; i++) {
					copy_arr(arr, test_arr[i], n);
				}//初始化测试数组,防止影响下一次排序的结果


				printf("冒泡排序:\n");
				start_time = clock();
				bubble_sort(test_arr[0], n);
				end_time = clock();
				time[0] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[0], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[0], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("插入排序:\n");
				start_time = clock();
				insrt_sort(test_arr[1], n);
				end_time = clock();
				time[1] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[1], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[1], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("快速排序:\n");
				start_time = clock();
				quick_sort(test_arr[2], 0, n - 1);
				end_time = clock();
				time[2] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[2], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[2], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("选择排序:\n");
				start_time = clock();
				selection_sort(test_arr[3], n);//排序
				end_time = clock();
				time[3] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[3], 0, n - 1); printf("\n");//输出排序后的结果
				if (compare_arrays(test_arr[3], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("堆排序:\n");
				start_time = clock();
				heap_sort(test_arr[4], n);
				end_time = clock();
				time[4] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[4], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[4], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("归并排序:\n");
				start_time = clock();
				merge_sort(test_arr[5], 0, n - 1);
				end_time = clock();
				time[5] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[5], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[5], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("基数排序:\n");
				start_time = clock();
				radix_sort(test_arr[6], 0, n - 1);
				end_time = clock();
				time[6] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[6], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[6], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("希尔排序:\n");
				start_time = clock();
				shell_sort(test_arr[7], n);
				end_time = clock();
				time[7] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[7], 0, n - 1); printf("\n");
				if (compare_arrays(test_arr[7], test_arr[0], n) == 0) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}




				for (int i = 0; i < 8; i++) {
					total_time[i] += time[i];
					total_compare_num[i] += compare_num[i].data;
				}//统计每种排序算法的总时间、总比较次数

				printf("\n\n");
				for (int i = 0; i < 8; i++) {
					printf("%s:%d趟  用时:%.2lf微秒\n", compare_num[i].sort_name, compare_num[i].data, time[i] * 1000000);
					every_compare_num[count][i] = compare_num[i].data;//存储每一次测试的每一个排序算法排序次数
					every_time_num[count][i] = time[i] * 1000000;//存储每一次测试的每一个排序算法时间
				}

			}
		}
		if (choice == 2) {

			if (flag == 0) {
				printf("请先进行排序测试!\n\n\n");
				continue;
			}

			for (int i = 0; i < counts; i++) {
				printf("第%d次测试结果:\n", i + 1);
				for (int j = 0; j < 8; j++) {
					printf("%s:%d趟  用时:%.2lf微秒\n", compare_num[j].sort_name, every_compare_num[i][j], every_time_num[i][j]);
				}
				printf("\n\n\n");
			}
		}
		if (choice == 3) {

			if (flag == 0) {
				printf("请先进行排序测试!\n\n\n");
				continue;
			}

			for (int i = 0; i < 8; i++) {
				average_time[i] = total_time[i] / counts * 1.0;
				average_compare_num[i] = total_compare_num[i] / counts * 1.0;
				printf("%s:平均%d趟  平均用时:%.2lf微秒\n", compare_num[i].sort_name, average_compare_num[i], average_time[i] * 1000000);
			}
		}
		if (choice == 0) {
			printf("感谢使用!\n");
			return 0;
		}
	} while (choice != 0);


	return 0;
}

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

typedef struct node {
	int data;
	char sort_name[50];
}compare;

compare compare_num[8];//存储排序名称和排序的趟数

void swap(int* a, int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}

int is_sorted(int arr[], int l, int r) {
	for (int i = l; i <= r - 1; i++) {
		if (arr[i] > arr[i + 1]) {
			return 0; // 如果存在逆序对,则未排好序
		}
	}
	return 1; // 如果不存在逆序对,则已排好序
}

void bubble_sort(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				swap(&arr[j], &arr[j + 1]);
				compare_num[0].data++;
				if (is_sorted(arr, 0, n - 1)) {
					return;
				}
			}
		}
		
	}
}

void insrt_sort(int arr[], int n) {
	for (int i = 1; i < n; i++) {
		int key = arr[i];//待排序的那一个元素位置相当于空出来了
		int j = i - 1;//从排好序的最后一个开始比较
		while (j >= 0 && arr[j] > key) {
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = key;
		compare_num[1].data++;
		if (is_sorted(arr, 0,n-1)) {
			return;
		}
		
	}
}

int pivot_index(int arr[], int left, int right) {
	int pivot = arr[left];
	int i = left + 1;
	int j = right;
	while (i <= j) {//即使i和j的停止条件是相悖的也要写=,因为只有两个元素的时候i和j相等,仍然需要排序
		while (arr[i] <= pivot && i <= right) {//找打比基准元素大的就停下来(需要写<=,来避免重复元素导致的无限循环)
			i++;
		}
		while (arr[j] >= pivot && j >= left + 1) {//找到比基准元素小的就停下来
			j--;
		}
		if (i < j) {//当i和j交叉时不要交换
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[left], &arr[j]);//j必然指向最后一个小于pivot的元素,前面的if语句会确保
	return j;
}
void quick_sort(int arr[], int left, int right) {
	compare_num[2].data++;
	if (right - left <= 0) return;//只有一个元素的时候不需要排序直接返回;
	int pivot = pivot_index(arr, left, right);
	quick_sort(arr, left, pivot - 1);
	quick_sort(arr, pivot + 1, right);
}

void selection_sort(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		int min_index = i;
		for (int j = i + 1; j < n; j++) {
			if (arr[j] < arr[min_index]) {
				min_index = j;
			}
		}
		swap(&arr[i], &arr[min_index]);
		compare_num[3].data++;
		if (is_sorted(arr, 0,n-1)) {
			return;
		}
		
	}
}
void heapify(int arr[], int n, int i) {
	int largest_index = i;
	int left_index = i * 2 + 1;
	int right_index = i * 2 + 2;
	if (arr[left_index] > arr[largest_index] && left_index < n) {
		largest_index = left_index;
	}
	if (arr[right_index] > arr[largest_index] && right_index < n) {
		largest_index = right_index;
	}
	if (largest_index != i) {
		swap(&arr[i], &arr[largest_index]);
		heapify(arr, n, largest_index);
	}
}
void heap_sort(int arr[], int n) {
	for (int i = n / 2 - 1; i >= 0; i--) {//n/2-1是最后一个非叶子节点,因为叶子节点没有子节点,不需要heapify
		heapify(arr, n, i);
	}
	for (int i = n - 1; i >= 0; i--) {
		if (is_sorted(arr, 0, n - 1)) {
			return;
		}
		swap(&arr[0], &arr[i]);
		compare_num[4].data++;

		heapify(arr, i, 0);
	}
}

void merge(int arr[], int l, int m, int r) {
	int n1 = m - l + 1;
	int n2 = r - m;
	int i, j, k;
	int* L = (int*)malloc(sizeof(int) * n1);
	int* R = (int*)malloc(sizeof(int) * n2);
	for (i = 0; i < n1; i++) {
		L[i] = arr[l + i];
	}
	for (j = 0; j < n2; j++) {
		R[j] = arr[m + 1 + j];
	}
	i = 0; j = 0; k = l;//k一定要从l开始,不是从0开始,如果从0开始会导致递归合并的时候覆盖错误
	while (i < n1 && j < n2) {
		if (L[i] < R[j]) {
			arr[k++] = L[i++];
		}
		else {
			arr[k++] = R[j++];
		}
	}
	while (i < n1) {
		arr[k++] = L[i++];
	}
	while (j < n2) {
		arr[k++] = R[j++];
	}
	
}
void merge_sort(int arr[], int l, int r) {
    compare_num[5].data++;
	if (r - l <= 0) return;//当只有一个元素的时候则返回,不需要合并
	int mid = (l + r) / 2;
	merge_sort(arr, l, mid);
	merge_sort(arr, mid + 1, r);
	merge(arr, l, mid, r);
}

int get_max(int arr[], int n) {
	int max = arr[0];
	for (int i = 1; i < n; i++) {
		if (arr[i] > max) max = arr[i];
	}
	return max;
}
void radix_sort(int arr[], int l, int r) {
	int max_val = get_max(arr, r - l + 1);
	int count = 0;
	while (max_val != 0) {
		max_val /= 10;
		count++;
	}
	int** buckets = (int**)malloc(sizeof(int*) * 10);//根据位数数字0-9,创建10个桶
	int* buckets_size = (int*)malloc(sizeof(int) * 10);//记录每个桶的元素个数来方便赋值到原数组进行排序
	for (int i = 0; i < 10; i++) {
		buckets[i] = (int*)malloc(sizeof(int) * (r - l + 1));
		buckets_size[i] = 0;
	}
	for (int i = 0; i < count; i++) {
		for (int j = l; j <= r; j++) {
			int temp = arr[j];
			temp = temp / (int)pow(10, i);
			int digit = temp % 10;
			buckets[digit][buckets_size[digit]++] = arr[j];
		}
		int index = l;
		for (int k = 0; k < 10; k++) {
			for (int m = 0; m < buckets_size[k]; m++) {//根据每个桶的元素个数来进行赋值
				arr[index++] = buckets[k][m];
			}
			buckets_size[k] = 0;//只需要情况每个桶的元素个数,不需要清空桶内元素
		}
		if (is_sorted(arr, l,r)) {
			return;
		}
		compare_num[6].data++;
	}
}

void shell_sort(int arr[], int n) {
	int gap;
	for (gap = n / 2; gap > 0; gap /= 2) {
		for (int i = gap; i < n; i++) {//i从gap开始,从第一组开始(插入排序假定第一个数字有序)
			int key = arr[i];
			int j = i - gap;
			while (j >= 0 && arr[j] > key) {
				arr[j + gap] = arr[j];
				j -= gap;//保证了每一个数组都和它那一组的数组进行插入排序,即间隔为gap
			}
			arr[j + gap] = key;//插入
			compare_num[7].data++;
			if (is_sorted(arr, 0,n-1)) {
				return;
			}
		}
	}
}//希尔排序


void print_arr(int arr[], int l, int r) {
	for (int i = l; i <= r; i++) {
		printf("%d ", arr[i]);
	}
}

void copy_arr(int arr[], int temp[], int n) {
	for (int i = 0; i < n; i++) {
		temp[i] = arr[i];
	}
}

int compare_arrays(int arr1[], int arr2[], int n) {
	for (int i = 0; i < n; i++) {
		if (arr1[i] != arr2[i]) {
			printf("排序错误\n\n");
			return 0;
		}
	}
	printf("排序正确\n\n");
	return 1;
}



int main() {

	int n = 10000;//排序的元素数量
	int counts = 5;//测试的回数
	srand(time(NULL));

	int** test_arr = (int**)malloc(sizeof(int*) * 8);
	for (int i = 0; i < 8; i++) {
		test_arr[i] = (int*)malloc(sizeof(int) * n);
	}//初始化测试数组,,选项1中每一次测试前进行了重置

	int* arr = (int*)malloc(sizeof(int) * n);//初始被测试数组,选项1中每一次测试前进行了初始化

	double time[8];//排序时间数组,选项1中每一次测试前进行了初始化
	double start_time = 0;//排序开始时间
	double end_time = 0;//排序结束时间

	int total_compare_num[8];//五次排序的比较次数总和数组
	int average_compare_num[8];//平均比较次数数组
	double total_time[8];//五次排序的时间总和数组
	double average_time[8];//平均时间数组
	for (int i = 0; i < 8; i++) {
		total_compare_num[i] = 0;//初始化比较次数为0
		average_compare_num[i] = 0;//初始化平均比较次数为0
		total_time[i] = 0;//初始化总时间为0
		average_time[i] = 0;//初始化平均时间为0
	}


	int** every_compare_num;//每一次测试的每一个排序算法的趟数数组
	every_compare_num = (int**)malloc(sizeof(int*) * counts);
	double** every_time_num;//每一次测试的每一个排序算法的时间数组
	every_time_num = (double**)malloc(sizeof(double*) * counts);
	for (int i = 0; i < counts; i++) {
		every_compare_num[i] = (int*)malloc(sizeof(int) * 8);
		every_time_num[i] = (double*)malloc(sizeof(double) * 8);
	}


	//初始化compare_num结构体数组
	for (int i = 0; i < 8; i++) {
		compare_num[i].data = 0;//初始化比较次数为0
	}
	strcpy(compare_num[0].sort_name, "冒泡排序:交换次数");
	strcpy(compare_num[1].sort_name, "插入排序:插入次数");
	strcpy(compare_num[2].sort_name, "快速排序:递归排序次数");
	strcpy(compare_num[3].sort_name, "选择排序:交换次数");
	strcpy(compare_num[4].sort_name, "堆排序:  交换次数");
	strcpy(compare_num[5].sort_name, "归并排序:递归排序次数");
	strcpy(compare_num[6].sort_name, "基数排序:分桶排序次数");
	strcpy(compare_num[7].sort_name, "希尔排序:插入次数");


	int choice;
	int flag = 0;
	do {
		printf("\n\n排序算法测试系统\n\n");
		printf("【1】调用八种排序算法进行排序\n");
		printf("【2】获取每一轮测试的八种排序算法的排序次数和时间\n");
		printf("【3】获取八种排序算法的平均排序次数和时间\n");
		printf("【0】退出系统\n");
		printf("请输入选项:");
		scanf("%d", &choice);
		printf("\n");
		if (choice == 1) {
			flag = 1;

			for (int count = 0; count < counts; count++) {

				for (int i = 0; i < 8; i++) {
					time[i] = 0;
				}//重置时间数组,防止影响下一次排序的时间计算结果

				for (int i = 0; i < 8; i++) {
					compare_num[i].data = 0;
				}//重置比较次数为0

				for (int i = 0; i < 8; i++) {
					for (int j = 0; j < n; j++) {
						test_arr[i][j] = 0;
					}
				}//重置测试数组,防止影响下一次排序的结果

				for (int i = 0; i < n; i++) {
					arr[i] = rand();
				}//初始化原始待排序数组
				print_arr(arr, 0, n - 1); printf("\n\n\n");
				for (int i = 0; i < 8; i++) {
					copy_arr(arr, test_arr[i], n);
				}//初始化测试数组,防止影响下一次排序的结果


				printf("冒泡排序:\n");
				start_time = clock();
				bubble_sort(test_arr[0], n);
				end_time = clock();
				time[0] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[0], 0, n - 1); printf("\n");
				printf("%d\n", is_sorted(test_arr[0], 0, n - 1));
				if (!is_sorted(test_arr[0] , 0, n-1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("插入排序:\n");
				start_time = clock();
				insrt_sort(test_arr[1], n);
				end_time = clock();
				time[1] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[1], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[1], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("快速排序:\n");
				start_time = clock();
				quick_sort(test_arr[2], 0, n - 1);
				end_time = clock();
				time[2] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[2], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[2], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("选择排序:\n");
				start_time = clock();
				selection_sort(test_arr[3], n);//排序
				end_time = clock();
				time[3] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[3], 0, n - 1); printf("\n");//输出排序后的结果
				if (!is_sorted(test_arr[3], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("堆排序:\n");
				start_time = clock();
				heap_sort(test_arr[4], n);
				end_time = clock();
				time[4] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[4], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[4], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("归并排序:\n");
				start_time = clock();
				merge_sort(test_arr[5], 0, n - 1);
				end_time = clock();
				time[5] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[5], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[5], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("基数排序:\n");
				start_time = clock();
				radix_sort(test_arr[6], 0, n - 1);
				end_time = clock();
				time[6] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[6], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[6], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}


				printf("希尔排序:\n");
				start_time = clock();
				shell_sort(test_arr[7], n);
				end_time = clock();
				time[7] = (end_time - start_time) / CLOCKS_PER_SEC;
				print_arr(test_arr[7], 0, n - 1); printf("\n");
				if (!is_sorted(test_arr[7], 0, n - 1)) {
					system("pause");
					return 0;//如果排序错误,则停止程序
				}




				for (int i = 0; i < 8; i++) {
					total_time[i] += time[i];
					total_compare_num[i] += compare_num[i].data;
				}//统计每种排序算法的总时间、总比较次数

				printf("\n\n");

				for (int i = 0; i < 8; i++) {
					printf("%s%d  用时:%.3lfms\n", compare_num[i].sort_name, compare_num[i].data, time[i] * 1000.0);
					every_compare_num[count][i] = compare_num[i].data;//存储每一次测试的每一个排序算法排序次数
					every_time_num[count][i] = time[i] * 1000.0;//存储每一次测试的每一个排序算法时间
				}

			}
		}
		if (choice == 2) {

			if (flag == 0) {
				printf("请先进行排序测试!\n\n\n");
				continue;
			}

			for (int i = 0; i < counts; i++) {
				printf("排序元素个数为%d\n", n);
				printf("第%d次测试结果:\n", i + 1);
				for (int j = 0; j < 8; j++) {
					printf("%s%d  用时:%.3lfms\n", compare_num[j].sort_name, every_compare_num[i][j], every_time_num[i][j]);
				}
				printf("\n\n\n");
			}
		}
		if (choice == 3) {

			if (flag == 0) {
				printf("请先进行排序测试!\n\n\n");
				continue;
			}

			printf("排序元素个数为%d  测试次数为%d\n", n, counts);

			for (int i = 0; i < 8; i++) {
				average_time[i] = total_time[i] / counts * 1.0;
				average_compare_num[i] = total_compare_num[i] / counts * 1.0;
				printf("%s%d  平均用时:%.3lfms\n", compare_num[i].sort_name, average_compare_num[i], average_time[i] * 1000.0);
			}
		}
		if (choice == 0) {
			printf("感谢使用!\n");
			return 0;
		}

	} while (choice != 0);


	return 0;
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值