快速排序 选择排序 冒泡排序 二分插入排序时间性能

来源:互联网 发布:ipadmini2网络差 编辑:程序博客网 时间:2024/06/05 18:13
#include<iostream>#include <algorithm>#include <windows.h>#include <time.h>#include <cstdio>#include <cstdlib>using namespace std;#define maxsize 10000typedef 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;}

阅读全文
0 0
原创粉丝点击