经典排序——归并、快排递归与非递归实现与冒泡排序

本文通过实验对比了递归与非递归实现的归并排序、快速排序及冒泡排序的性能,采用随机数据集进行测试,并记录不同数据规模下的运行时间。
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <stack>
using namespace std;

void merge(int a[],int b[],int l,int mid,int r){
    int i = l, j = mid + 1;
    int k = 0;
    while(i <= mid && j <= r){
        if(a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    while(i <= mid) b[k++] = a[i++];
    while(j <= r) b[k++] = a[j++];
    for(i = 0 ; i < k; i ++)
        a[i+l] = b[i];
}

void mergesort_recursive(int a[],int b[],int l,int r){
    if(l < r){
        int mid = (l + r) >> 1;
        mergesort_recursive(a,b,l,mid);
        mergesort_recursive(a,b,mid+1,r);
        merge(a,b,l,mid,r);
    }
}

void merge2(int a[],int b[],int l,int mid,int r){
    int i = l, j = mid + 1;
    int k = l;
    while(i <= mid && j <= r){
        if(a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    while(i <= mid) b[k++] = a[i++];
    while(j <= r) b[k++] = a[j++];
}

void mergepass(int a[],int b[],int s,int n){
    int i = 0;
    while(i <= n - 2*s){
        merge2(a,b,i,i+s-1,i+2*s-1);
        i += 2*s;
    }
    if(i + s < n)
        merge2(a,b,i,i+s-1,n-1);
    else
        for(int j = i ; j < n ; j ++)
            b[j] = a[j];
}

void mergesort_unrecursive(int a[],int n){
    int *b = new int[n];
    int s = 1;
    while(s < n){
        mergepass(a,b,s,n);
        s += s;
        mergepass(b,a,s,n);
        s += s;
    }
   // for(int i = 0 ; i < n ; i ++)
      //  printf("%d ",a[i]);
}

bool MergeSort1(int a[],int n){
    int *b = new int[n];
    if(b == NULL)
        return false;
    mergesort_recursive(a,b,0,n-1);
    //for(int i = 0 ; i < n ; i ++)
      //  printf("%d ",a[i]);
   // puts("");
    delete b;
    return true;
}

void swap(int &a,int &b){
    int temp;
    temp = a;a = b; b = temp;
}

int partition(int a[],int l,int r){
    int m = ((r - l) >> 1) + l;
    swap(a[m],a[r]);
    int x = a[r];
    int i = l - 1;
    for(int j = l ; j < r ; j ++){
        if(a[j] < x){
            i ++;
            swap(a[i],a[j]);
        }
    }
    swap(a[i+1],a[r]);
    return i + 1;
}

void qsort(int a[],int l,int r){
    if(l < r){
        int q = partition(a,l,r);
        qsort(a,l,q-1);
        qsort(a,q+1,r);
    }
}

void qsort_recursive(int a[],int l,int r){
    stack<int> st1;
    stack<int> st2;
    st1.push(l);
    st2.push(r);
    while(!st1.empty() && !st2.empty()){
        int tleft = st1.top();
        int tright = st2.top();
        st1.pop(),st2.pop();
        if(tleft >= tright) continue;
        int q = partition(a,tleft,tright);
        st1.push(tleft);st1.push(q+1);
        st2.push(q-1);st2.push(tright);
    }
}

void bubblesort(int a[],int n){
    bool flag = true;
    int k = n;
    while(flag){
        flag = false;
        for(int j = 1; j < k ; j ++){
            if(a[j - 1] > a[j]){
                swap(a[j-1],a[j]);
                flag = true;
            }
        }
        k --;
    }
}

int random(int n){
    double ran = (double)(rand()/(double)RAND_MAX);
    ran = ran * (n - 1) + 1.0;
    return (int)ran;
}

int main()
{
    srand((int)time(0));
    double ans;
    for(int n = 100 ; n <= 10000000 ; n *=10){
        int *a = new int[n];
        for(int i = 0 ; i < n ; i ++)
            a[i] = random(n*10);

        clock_t start,finish;
        start = clock();
        bool res = MergeSort1(a,n);
        finish = clock();
        ans = (double)(finish - start) / CLOCKS_PER_SEC;
        printf("数据量为%d时:\n",n);
        printf("递归归并排序耗时:%.1fms\n",ans*1000);

        for(int i = 0 ; i < n ; i ++)
            a[i] = random(n*10);
        start = clock();
        mergesort_unrecursive(a,n);
        finish = clock();
        ans = (double)(finish - start) / CLOCKS_PER_SEC;
        printf("非递归归并排序耗时:%.1fms\n",ans*1000);

        for(int i = 0 ; i < n ; i ++)
            a[i] = random(n*10);
        start = clock();
        qsort(a,0,n-1);
        finish = clock();
        ans = (double)(finish - start) / CLOCKS_PER_SEC;
        printf("递归快速排序耗时:%.1fms\n",ans*1000);

        for(int i = 0 ; i < n ; i ++)
            a[i] = random(n*10);
        start = clock();
        qsort_recursive(a,0,n-1);
        finish = clock();
        ans = (double)(finish - start) / CLOCKS_PER_SEC;
        printf("非递归快速排序耗时:%.1fms\n",ans*1000);


        for(int i = 0 ; i < n ; i ++)
            a[i] = random(n*10);
        start = clock();
        //bubblesort(a,n);
        finish = clock();
        ans = (double)(finish - start) / CLOCKS_PER_SEC;
        printf("冒泡排序耗时:%.1fms\n",ans*1000);
        printf("\n");
        delete []a;
    }
    return 0;
}


习惯了递归的实现方法,非递归的很有必要学学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值