数据结构课设(各大排序方法比较)
实现了数据结构(清华大学王红梅)书上介绍的所有排序方法的比较。以下是源代码,课设报告和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);
};