数据结构课设(各大排序方法比较)

数据结构课设(各大排序方法比较)

实现了数据结构(清华大学王红梅)书上介绍的所有排序方法的比较。以下是源代码,课设报告和PPT已上传至本人CSDN博客空间。

源代码

#include <iostream>
#include<ctime>;
#include<cstdlib>;
using namespace std;
const int N = 10000;
const int M = 10;
const int m = 100;
struct Node
{
	int key;
	int next;
};
struct QueueNode
{
	int front;
	int rear;
};
void Print();
void Random(int r[]);
clock_t TimeCount(int r[], int n, void(*function)(int r[], int n));
clock_t TimeCount_Quick(int r[], int first, int end, void(*function)(int r[], int first, int end));
clock_t TimeCount_Merge1(int r[], int r1[], int n, void(*function)(int r[], int r1[], int n));
clock_t TimeCount_Bucket(Node r[], QueueNode q[], int n, int m, void(*function)(Node r[], QueueNode q[], int n, int m));
void InsertSort(int r[], int n);//第一个空间做哨兵;
void ShellSort(int r[], int n);//第一个空间做哨兵;
void BubbleSort(int r[], int n);
int Partition(int r[], int first, int end);
void QuickSort(int r[], int first, int end);
void SelectSort(int r[], int n);//第一个空间浪费;
void Sift(int r[], int k, int m);
void HeapSort(int r[], int n);//第一个空间浪费;
void Merge(int r[], int r1[], int s, int m, int t);
void MergePass(int r[], int r1[], int n, int h);
void MergeSort1(int r[], int r1[], int n);
void MergeSort2(int r[], int r1[], int s, int t);
void Distribute1(Node r[], int n, QueueNode q[], int m, int first);
void Distribute2(Node r[], int n, QueueNode q[], int m, int first);
void Collect1(Node r[], int n, QueueNode q[], int m, int first);
void Collect2(Node r[], int n, QueueNode q[], int m, int first, int c[]);
void BucketSort(Node r[], QueueNode q[], int n, int m);
void RadixSort(Node r[], QueueNode q[], int n, int m, int d, int c[]);
int main() {
	Print();
	int choice, r[N],rr[N],r1[M],rr1[M],d=2;
	Node q1[M];
	Node q11[10];
	QueueNode q22[100];
	QueueNode q2[N];
	clock_t start;
	while (1) {
		cout << endl << "请选择要执行的算法:";
		cin >> choice;
		switch (choice) {
		case 1:
			cout << "你选择了插入排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			InsertSort(r1, M);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "插入排序"<<N<<"个数耗时:" << TimeCount(r, N, InsertSort) << "ms"
				<< endl;
			break;
		case 2:
			cout << "你选择了希尔排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout  << "排序后的结果为:";
			ShellSort(r1, M);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "希尔排序"<<N<<"个数耗时:" << TimeCount(r, N, ShellSort) << "ms"
				<< endl;
			break;
		case 3:
			cout << "你选择了冒泡排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			BubbleSort(r1, M);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "冒泡排序"<<N<<"个数耗时:" << TimeCount(r, N, BubbleSort) << "ms"
				<< endl;
			break;
		case 4:
			cout << "你选择了快速排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			QuickSort(r1,0,M-1);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "快速排序"<<N<<"个数耗时:" << TimeCount_Quick(r,0,N-1,QuickSort) << "ms"
				<< endl;
			break;
		case 5:
			cout << "你选择了选择排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			SelectSort(r1,M);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "选择排序"<<N<<"个数耗时:" << TimeCount(r,N, SelectSort) << "ms"
				<< endl;
			break;
		case 6:
			cout << "你选择了堆排序,请输入9个数,进行排序:";
			for (int i = 1; i <M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			HeapSort(r1, M-1);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "堆排序"<<N<<"个数耗时:" << TimeCount(r, N, HeapSort) << "ms"
				<< endl;
			break;
		case 7:
			cout << "你选择了归并排序,请输入9个数,进行排序:";
			for (int i = 1; i < M; i++)cin >> r1[i];
			cout << "排序后的结果为:";
			MergeSort1(r1,rr1,M-1);
			for (int i = 1; i < M; i++)cout << r1[i] << " ";
			Random(r);
			cout << endl << "归并排序"<<N<<"个数耗时:" << TimeCount_Merge1(r, rr,N, MergeSort1) << "ms"
				<< endl;
			break;
		case 8:
			cout << "你选择了桶式排序,请输入10个数(0-100),进行排序:";
			BucketSort(q11,q22,10,100);
			cout << "基数排序对数值有范围限制,故不计时比较与其他排序比较" << endl;
			break;
		case 9:
			cout << "你选择了基数排序,请输入10个数(0-10000),进行排序:";
			RadixSort(q1, q2, M, N,d,r1);
			cout << "基数排序对数值有范围限制,故不计时比较与其他排序比较" << endl;
			break;
		default:
			cout << "测试结束!";
		}
	}

	
}
void Print() {
	cout << "\t\t" << "算法比较" << endl;
	for (int i = 0; i < 20; i++)cout << "--";
	cout <<endl<< "1.插入排序\t\t" << "2.希尔排序" << endl << "3.冒泡排序\t\t" << "4.快速排序"
		<< endl << "5.选择排序\t\t"<< "6.堆排序" << endl << "7.归并排序\t" << endl<< "8.桶式排序\t\t"
		<< "9.基数排序" << endl;
	for (int i = 0; i < 20; i++)cout << "--";
}
void Random(int r[]) {
	srand(time(nullptr));
	for (int i = 0; i < N; i++)
	{
		r[i] = rand() % N;
	}
}
clock_t TimeCount(int r[], int n, void(* function)(int r[], int n)) {
	clock_t start = clock();
	function(r, N);
	clock_t end = clock();
	clock_t duration = (end- start);
	return duration;
}
clock_t TimeCount_Quick(int r[], int first,int end, void(*function)(int r[], int first,int end)) {
	clock_t start2 = clock();
	function(r,first,end);
	clock_t end2 = clock();
	clock_t duration2 = (end2 - start2);
	return duration2;
}
clock_t TimeCount_Merge1(int r[], int r1[], int n, void(*function)(int r[], int r1[], int n)) {
	clock_t start3 = clock();
	function(r, r1, n);
	clock_t end3 = clock();
	clock_t duration3 = (end3 - start3);
	return duration3;
}
clock_t TimeCount_Bucket(Node r[], QueueNode q[], int n, int m, void(*function)(Node r[], QueueNode q[], int n, int m))
{
	clock_t start5 = clock();
	function(r,q,n,m);
	clock_t end5 = clock();
	clock_t duration5 = (end5 - start5);
	return duration5;
}
void InsertSort(int r[], int n)
{
	int i = 0, j = 0;
	for (i = 2; i < n; i++)
	{
		r[0] = r[i];
		for (j = i - 1; r[0] < r[j]; j--)
			r[j + 1] = r[j];
		r[j + 1] = r[0];
	}
}
void ShellSort(int r[], int n)
{
	int j = 0;
	for (int d = n / 2; d >= 1; d = d / 2)
	{
		for (int i = d + 1; i < n; i++)
		{
			r[0] = r[i];
			for (j = i - d; j > 0 && r[0] < r[j]; j = j - d)
				r[j + d] = r[j];
			r[j + d] = r[0];
		}
	}
}
void BubbleSort(int r[], int n)
{
	int temp;
	for (int i = 1; i < n; i++) {
		for (int j = n - 1; j >= i; j--) {
			if (r[j] < r[j - 1]) {
				temp = r[j - 1];
				r[j - 1] = r[j];
				r[j] = temp;
			}
		}
	}
}
int Partition(int r[], int first, int end)
{
	int i = first, j = end, temp;
	while (i < j)
	{
		while (i < j && r[i] <= r[j])j--;
		if (i < j) {
			temp = r[i];
			r[i] = r[j];
			r[j] = temp;
			i++;
		}
		while (i < j && r[i] <= r[j])i++;
		if (i < j) {
			temp = r[j];
			r[j] = r[i];
			r[i] = temp;
			j--;
		}
	}
	return i;
}
void QuickSort(int r[], int first, int end)
{
	if (first < end) {
		int pivot = Partition(r, first, end);
		QuickSort(r, first, pivot - 1);
		QuickSort(r, pivot + 1, end);
	}
}
void SelectSort(int r[], int n)
{
	int index, temp;
	for (int i = 1; i < n; i++)
	{
		index = i;
		for (int j = i + 1; j < n; j++)
			if (r[j] < r[index])index = j;
		if (index != i)
		{
			temp = r[i];
			r[i] = r[index];
			r[index] = temp;
		}
	}
}
void Sift(int r[], int k, int m)
{
	int i = k; int j = 2 * i, temp;
	while (j <= m)
	{
		if (j < m && r[j] < r[j + 1])j++;
		if (r[i] > r[j])break;
		else {
			temp = r[i];
			r[i] = r[j];
			r[j] = temp;
			i = j;
			j = 2 * i;
		}
	}
}
void HeapSort(int r[], int n)
{
	for (int i = n / 2; i >= 1; i--)
		Sift(r, i, n);
	for (int i = 1; i < n; i++)
	{
		int temp = r[1];
		r[1] = r[n - i + 1];
		r[n - i + 1] = temp;
		Sift(r, 1, n - i);
	}
}
void Merge(int r[], int r1[], int s, int m, int t)
{
	int i = s, j = m + 1, k = s;
	while (i <= m && j <= t)
	{
		if (r[i] <= r[j])
			r1[k++] = r[i++];
		else
			r1[k++] = r[j++];
	}
	if (i <= m)while (i <= m)
		r1[k++] = r[i++];
	else while (j <= t)
		r1[k++] = r[j++];
}
void MergePass(int r[], int r1[], int n, int h)
{
	int i = 1;
	while (i <= n - 2 * h + 1)
	{
		Merge(r, r1, i, i + h - 1, i + 2 * h - 1);
		i += 2 * h;
	}
	if (i < n - h + 1)Merge(r, r1, i, i + h - 1, n);
	else for (int k = i; k <= n; k++)
		r1[k] = r[k];
}
void MergeSort1(int r[], int r1[], int n)
{
	int h = 1;
	while (h < n)
	{
		MergePass(r, r1, n, h);
		h = 2 * h;
		MergePass(r1, r, n, h);
		h = 2 * h;
	}
}
void Distribute1(Node r[], int n, QueueNode q[], int m, int first)
{
	int i;
	int k;
	i = first;
	while (r[i].next != -1)
	{
		k = r[i].key;
		if (q[k].front == -1)
		{
			q[k].front = i;
		}
		else
			r[q[k].rear].next = i;
		q[k].rear = i;
		i = r[i].next;
		r[i - 1].next = -1;
	}
	k = r[i].key;
	if (q[k].front == -1)
	{
		q[k].front = i;
	}
	else
		r[q[k].rear].next = i;
	q[k].rear = i;
};
void Distribute2(Node r[], int n, QueueNode q[], int m, int first)  //分配
{
	int i;
	int k;
	i = first;
	while (r[i].next != -1)
	{
		k = r[i].key;
		if (q[k].front == -1)
		{
			q[k].front = i;
		}
		else
			r[q[k].rear].next = i;
		q[k].rear = i;
		i = r[i].next;
		r[i - 1].next = -1;
	}
	k = r[i].key;
	if (q[k].front == -1)
	{
		q[k].front = i;
	}
	else
		r[q[k].rear].next = i;
	q[k].rear = i;
};
void Collect1(Node r[], int n, QueueNode q[], int m, int first)
{
	int k, last, a = 0;
	k = 0;
	while (q[k].front == -1)
	{
		k++;
	}
	first = q[k].front;
	last = q[k].rear;
	while (k < m - 1)
	{
		k++;
		if (q[k].front != -1)
		{
			r[last].next = q[k].front;
			last = q[k].rear;
		}
	}
	r[last].next = -1;
	cout << "排序结果为:" << endl;
	a = first;
	while (r[a].next != -1)
	{
		cout << r[a].key << " ";
		a = r[a].next;
	}
	cout << r[a].key << endl;
};
void Collect2(Node r[], int n, QueueNode q[], int m, int first, int c[])  //收集
{
	int k, last, a = 0;
	int count = 0;
	k = 0;
	while (q[k].front == -1)
	{
		k++;
	}
	first = q[k].front;
	last = q[k].rear;
	while (k < m - 1)
	{
		k++;
		if (q[k].front != -1)
		{
			r[last].next = q[k].front;
			last = q[k].rear;
		}
	}
	r[last].next = -1;
	for (int i = 0; i < n; i++)
		r[i].key = c[i];
	a = first;
	while (r[a].next != -1)
	{
		cout << r[a].key << " ";
		c[count] = r[a].key;
		a = r[a].next;
		count++;
	}
	cout << r[a].key << endl;
	c[n - 1] = r[a].key;
};
void BucketSort(Node r[], QueueNode q[], int n, int m)
{
	int first;
	int i, j;
	for (i = 0; i < n; i++)
		r[i].next = i + 1;
	r[n - 1].next = -1; first = 0;
	for (i = 0; i < m; i++)
		q[i].front = q[i].rear = -1;
	for (j = 0; j < n; j++)
	{
		cin >> r[j].key;
	}
	Distribute1(r, n, q, m, first);
	Collect1(r, n, q, m, first);
};
void RadixSort(Node r[], QueueNode q[], int n, int m, int d, int c[]) //算法
{
	int i, j, first;
	int Radix = 10;  //基数
	for (i = 0; i < n; i++)
		r[i].next = i + 1;
	r[n - 1].next = -1; first = 0;
	for (i = 0; i < m; i++)
		q[i].front = q[i].rear = -1;
	for (i = 0; i < n; i++)   //输入
	{
		cin >> r[i].key;
		c[i] = r[i].key;
	}
	for (i = 0; i < n; i++)   //个位
	{
		if (10 <= r[i].key && r[i].key < 100)
			r[i].key = r[i].key % Radix;
		else if (100 <= r[i].key && r[i].key < 1000)
			r[i].key = (r[i].key % 100) % Radix;
		else if (1000 <= r[i].key && r[i].key < 10000)
			r[i].key = ((r[i].key % 1000) % 100) % Radix;
	}
	cout << "第一次个位分配结果:" << endl;
	Distribute2(r, n, q, m, first);
	Collect2(r, n, q, m, first, c);
	for (j = 0; j < n; j++)  //十位
	{
		r[j].key = c[j];
		r[j].next = j + 1;
	}
	r[n - 1].next = -1;
	for (i = 0; i < m; i++)
		q[i].front = q[i].rear = -1;
	for (i = 0; i < n; i++)
		if (0 <= r[i].key && r[i].key < 10)
			r[i].key = 0;
		else if (10 <= r[i].key && r[i].key < 100)
			r[i].key = r[i].key / Radix;
		else if (100 <= r[i].key && r[i].key < 1000)
			r[i].key = (r[i].key % 100) / Radix;
		else if (1000 <= r[i].key && r[i].key < 10000)
			r[i].key = ((r[i].key % 1000) % 100) / Radix;
	cout << "第二次十位分配结果:" << endl;
	Distribute2(r, n, q, m, first);
	Collect2(r, n, q, m, first, c);
	for (j = 0; j < n; j++)  //百位
	{
		r[j].key = c[j];
		r[j].next = j + 1;
	}
	r[n - 1].next = -1;
	for (i = 0; i < m; i++)
		q[i].front = q[i].rear = -1;
	for (i = 0; i < n; i++)
		if (0 <= r[i].key && r[i].key < 100)
			r[i].key = 0;
		else if (100 <= r[i].key && r[i].key < 1000)
			r[i].key = r[i].key / 100;
		else if (1000 <= r[i].key && r[i].key < 10000)
			r[i].key = (r[i].key % 1000) / 100;
	cout << "第三次百位分配结果:" << endl;
	Distribute2(r, n, q, m, first);
	Collect2(r, n, q, m, first, c);
	for (j = 0; j < n; j++)  //千位
	{
		r[j].key = c[j];
		r[j].next = j + 1;
	}
	r[n - 1].next = -1;
	for (i = 0; i < m; i++)
		q[i].front = q[i].rear = -1;
	for (i = 0; i < n; i++)
		if (0 <= r[i].key && r[i].key < 1000)
			r[i].key = 0;
		else if (1000 <= r[i].key && r[i].key < 10000)
			r[i].key = r[i].key / 1000;
	cout << "第四次千位分配结果:" << endl;
	Distribute2(r, n, q, m, first);
	Collect2(r, n, q, m, first, c);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值