#include<iostream>
#include <algorithm>
#include <windows.h>
#include <time.h>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define maxsize 10000
typedef int element;
typedef struct //定义顺序表的基本结构
{
element *elem;//数据
int length, listsize;
} Sqlist;
void initList(Sqlist &L, int n) //初始化顺序表
{
if(n > maxsize)
cout<<"超出最大的容量"<<endl;
L.elem = new int[n];
L.length = n;
L.listsize = maxsize;
}
void input(Sqlist &L) //输入顺序表的每一个元素
{
for(int i = 0; i < L.length; i++)
cin>>L.elem[i];
}
void select_sort(Sqlist &L) //选择排序
{
int temp, k;
for(int i = 0; i < L.length-1; i++)
{
k = i;
for(int j = i+1; j < L.length; j++)
{
if(L.elem[k] > L.elem[j])
k = j;
}
if(k != i)
{
temp = L.elem[k];
L.elem[k] = L.elem[i];
L.elem[i] = temp;
}
}
}
void maopao_sort(Sqlist &L) //冒泡排序
{
int temp;
for(int i = 0; i < L.length-1; i++)
{
for(int j = 0; j < L.length-i-1; j++)
{
if(L.elem[j] > L.elem[j+1])
{
temp = L.elem[j];
L.elem[j] = L.elem[j+1];
L.elem[j+1] = temp;
}
}
}
}
void quick_sort(Sqlist &L, int left, int right) //快速排序
{
int i,j,temp;
i = left;
j = right;
temp = L.elem[left];
if(left > right)
return;
while(i!=j)/*找到最终位置*/
{
while(L.elem[j] >= temp && j>i)
j--;
if(j>i)
L.elem[i++] = L.elem[j];
while(L.elem[i] <= temp && j>i)
i++;
if(j>i)
L.elem[j--] = L.elem[i];
}
L.elem[i]=temp;
quick_sort(L,left,i-1);/*递归左边*/
quick_sort(L,i+1,right);/*递归右边*/
}
void binsert_sort(Sqlist &L) //二分插入排序
{
int j;
for(int i= 1; i<L.length; i++)
{
int low=0,high=i;
if(L.elem[i] < L.elem[i-1]) //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
{
int x = L.elem[i]; //复制为哨兵,即存储待排序元素
L.elem[i] = L.elem[i-1]; //先后移一个元素 (因为a[i]就是X,所以不怕丢失)
while(low<=high) //查找在有序表的插入位置 (遍历表)
{
int m=(low+high)/2;
if(x < L.elem[m]) high=m-1;
else low=m+1;
}
for(j=i-1; j>=high+1; j--)
L.elem[j+1]=L.elem[j];
L.elem[j+1] = x; //插入到正确位置
}
}
}
void show(Sqlist &L)
{
int i;
for(i = 0; i < L.length-1; i++)
cout<<L.elem[i]<<" ";
cout<<L.elem[i]<<endl;
}
int main()
{
string order;
cout<<"输入数组容量"<<endl;
int n;
cin>>n;
Sqlist L;
initList(L, n);
clock_t start, finish;
double runtime;
for(int i = 0; i < 4; i++)
{
cout<<"---输入每一个数组元素---"<<endl;
input(L);
cout<<"选择排序方式或是操作指令"<<endl;
cout<<"quick_sort: 快速排序"<<endl;
cout<<"select_sort: 选择排序"<<endl;
cout<<"maopao_sort: 冒泡排序"<<endl;
cout<<"binsert_sort: 二分插入排序"<<endl;
cout<<"show: 显示当前数组"<<endl;
cout<<"quit : 退出对当前数组的操作"<<endl;
while(1)
{
cin>>order;
if(order == "quick_sort")
{
start = clock();
for(int k = 0; k < 100000; k++)
quick_sort(L, 0, L.length-1);
finish = clock();
runtime = (double)(finish-start);
printf("快速排序完成此排序所用的时间为%lf毫秒\n", runtime);
cout<<"排序后的数组为"<<endl;
show(L);
}
else if(order == "select_sort")
{
start = clock();
for(int k = 0; k < 100000; k++)
select_sort(L);
finish = clock();
runtime = (double)(finish-start);
printf("选择排序完成此排序所用的时间为%lf毫秒\n", runtime);
cout<<"排序后的数组为"<<endl;
show(L);
}
else if(order == "maopao_sort")
{
start = clock();
for(int k = 0; k < 100000; k++)
maopao_sort(L);
finish = clock();
runtime = (double)(finish-start);
printf("冒泡排序完成此排序所用的时间为%lf毫秒\n", runtime);
cout<<"排序后的数组为"<<endl;
show(L);
}
else if(order == "binsert_sort")
{
start = clock();
for(int k = 0; k < 100000; k++)
binsert_sort(L);
finish = clock();
runtime = (double)(finish-start);
printf("二分插入排序完成此排序所用的时间为%lf毫秒\n", runtime);
cout<<"排序后的数组为"<<endl;
show(L);
}
else if(order == "show")
{
show(L);
}
else if(order == "quit")
{
cout<<"***已退出,请输入下一个数组***"<<endl;
break;
}
else
cout<<"输入的操作指令有误,请检查后重新输入"<<endl;
}
}
return 0;
}
快速排序 选择排序 冒泡排序 二分插入排序时间性能
最新推荐文章于 2022-04-07 22:03:37 发布