快速排序、归并排序、插入排序与基数排序

来源:互联网 发布:淘宝店铺html5 编辑:程序博客网 时间:2024/06/07 04:09
////  main.cpp//  SortingAlgorithms////  Created by 孙江涛 on 13-10-12.//  Copyright (c) 2013年 Bryan. All rights reserved.//#include <iostream>#include <vector>using std::vector;using std::cout;using std::endl;using std::cin;/* Start of Quick-Sort */long Partition(vector<unsigned int> &Vec,long p,long r){    unsigned int x = Vec[r];        long i = p - 1;    for(long j = p;j < r;j++)        if(Vec[j]<=x)        {            i = i+1;            unsigned int temp = Vec[i];            Vec[i] = Vec[j];            Vec[j] = temp;                    }    unsigned int temp = Vec[i+1];    Vec[i+1] = Vec[r];    Vec[r]=temp;        return i+1;}void QuickSort(vector<unsigned int> &Vec,long p,long r){    if(p<r)    {        long q = Partition(Vec, p,r );        QuickSort(Vec, p, q-1);        QuickSort(Vec, q+1,r);    }}/* End of Quick-Sort *//* Start of Merge-Sort */void Merge(vector<unsigned int> &Vec,long start,long middle,long end){    long L_length = middle-start+1;    long R_length = end - middle;        vector<unsigned int> LVec;    vector<unsigned int> RVec;        long i,j,k;    for(i = 0;i<L_length;i++)    {        LVec.push_back(Vec[start+i]);    }        for(j =0;j<R_length;j++)    {        RVec.push_back(Vec[middle+1+j]);           }            for(i = 0,j = 0, k =start;i < L_length && j<R_length;k++)    {        if(LVec[i]<= RVec[j])        {            Vec[k] = LVec[i];            i++;        }        else if(LVec[i]>RVec[j])        {            Vec[k] = RVec[j];            j++;        }    }    if(i < L_length)    {        for(j = i;j < L_length;j++,k++)            Vec[k] = LVec[j];    }    if(j < R_length)    {        for(i = j;i < R_length;i++,k++)            Vec[k] = RVec[i];    }            }void MergeSort(vector<unsigned int> &Vec,long start,long end){        if(start==end)        return;        else if(start<end)    {        long middle = (start+end)/2;        MergeSort(Vec, start, middle);        MergeSort(Vec, middle+1, end);        Merge(Vec,start,middle,end);        return;    }        }/* End of Merge-Sort *//*  Start of Random number generator */bool ProduceRandomNumberCRand(vector<unsigned int> &RandomVec,long  size){    time_t t;    srand((unsigned)time(&t));        for(long i=0;i<size;i++)    {        RandomVec.push_back((rand()<<17)|(rand()<<3)|(rand()));    }        if(RandomVec.size()==0)    {        return false;    }    return true;}/* End of Random number generator */void InsertionSort(vector<unsigned int> &Vec,long int size){    for(vector<unsigned int>::iterator it = Vec.begin()+1;it!= Vec.end();it++)    {        unsigned int key = *it;        //unsigned int tmp;                vector<unsigned int>::iterator it1 = it - 1;                while (it1>=Vec.begin() && (*it1)>key)        {            *(it1+1) = *it1;            it1--;        }        *(it1+1) = key;                    }    }/* End of Insertation Sort *//* Start of RadixSort */int MaxBit(vector<unsigned int> &Vec,long n){        int BitNum = 1;    for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++ )    {        int TempBitNum = 1;        unsigned int TempNum= *it;        while(TempNum/10)        {            TempNum =TempNum/10;            TempBitNum++;        }        if(TempBitNum>BitNum)            BitNum = TempBitNum;                           }     return BitNum;        }void RadixSort(vector<unsigned int> &Vec,long n){    int BitNum = MaxBit(Vec, Vec.size());        long count[10];        unsigned int *temp = new unsigned int[n];        int r = 1;        for(int i = 0;i<BitNum;i++)    {        for(int j =0;j<10;j++)        {            count[j] = 0;        }                for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++)        {            int k = ((*it)/r)%10;            count[k]++;        }        for(int i = 1;i<10;i++)        {            count[i] += count[i-1];        }        for(vector<unsigned int>::iterator it = Vec.end()-1;it != Vec.begin()-1;it--)        {            int k = ((*it)/r)%10;            count[k]--;            temp[count[k]] = *it;        }        int n = 0;        for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++,n++)        {            *it = temp[n];        }                r *= 10;                    }    }/* End of RadixSort */ /* 主函数 */int main(int argc, const char * argv[]){    long NumScale;    cout<<"请输入数据规模(输入0退出)"<<endl;    cin>>NumScale;    while(NumScale!=0)    {    vector<unsigned int> UIVec;    ProduceRandomNumberCRand(UIVec,NumScale);    long double s_QuickSrot,e_QuickSrot,s_MergeSort,e_MergeSort,s_InsertionSort,e_InsertionSort,s_RadixSort,e_RadixSort;    vector<unsigned int> UIVecQuickSort(UIVec);    vector<unsigned int> UIVecMergeSort(UIVec);    vector<unsigned int> UIVecInsertionSort(UIVec);    vector<unsigned int> UIVecRadixSort(UIVec);        s_QuickSrot = clock();    QuickSort(UIVecQuickSort, 0, UIVecQuickSort.size()-1);    e_QuickSrot = clock();            s_MergeSort = clock();    MergeSort(UIVecMergeSort, 0, UIVecMergeSort.size()-1);    e_MergeSort = clock();        s_InsertionSort = clock();    InsertionSort(UIVecInsertionSort, UIVecInsertionSort.size());    e_InsertionSort = clock();        s_RadixSort = clock();    RadixSort(UIVecRadixSort, UIVecRadixSort.size());    e_RadixSort = clock();        cout<<"QuickSort,time: "<<(e_QuickSrot-s_QuickSrot)/CLOCKS_PER_SEC<<"s"<<endl;    cout<<"MergeSort,time: "<<(e_MergeSort-s_MergeSort)/CLOCKS_PER_SEC<<"s"<<endl;    cout<<"InsertionSort,time: "<<(e_InsertionSort-s_InsertionSort)/CLOCKS_PER_SEC<<"s"<<endl;    cout<<"RadixSort,time "<<(e_RadixSort-s_RadixSort)/CLOCKS_PER_SEC<<"s"<<endl;        cout<<"请输入数据规模(输入0退出)"<<endl;cin>>NumScale;    }    return 0;}

原创粉丝点击