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

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值