EricYang

Tech Spot of Eric

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include "runCLock.h"

#define DEBUG_INSERT 1
#define DEBUG_BUBBLE 1
#define DEBUG_QUICK  1
#define DEBUG_SELECT 1
#define DEBUG_HEAP   1
#define DEBUG_MERGE  1
#define DEBUG_SHELL  1

using namespace std;

// data defination
const int LEN=60000;
const int BOUNDARY=14997;

//basic OP
void init(int s[], const int LEN)
{
    srand((unsigned)time(NULL));
    for(int i=0; i<LEN; i++)
    {
        s[i]= rand()%BOUNDARY;
    }
}

void print(int s[], const int LEN)
{
    for(int i=0; i<LEN; i++)
    {
        cout<<s[i]<<" ";
    }
    cout<<endl;
}

//insertSort
void insertSort(int s[], const int LEN)
{
   int i,j;
   int tmp;

   for(i=1; i<LEN; i++)
   {
       tmp=s[i];
       j=i;
       while(j>=1 && tmp<s[j-1])
       {
           s[j]=s[j-1];
           j--;
       }
       s[j]=tmp;
   }
}

//shellSort
void shellSort(int s[],const int LEN)
{
    int i,j,k;
    int temp;
    int h;

    h=1;
    while(h<LEN)
    {
        h=3*h+1;
    }

    while(h>=1)
    {
        h=h/3;
        for(k=0; k<h; k++)
        {
            for(i=k+h;i<LEN;i+=h)
            {
                temp=s[i];
                j=i;
                while(j>=h && temp<s[j-h])
                {
                    s[j]=s[j-h];
                    j-=h;
                }
                s[j]=temp;
            }
        }
    }
}
//bubbleSort
void bubbleSort(int s[], const int LEN)
{
    int tmp;

    for(int i=0; i<=LEN-1; i++)
    {
        for(int j=0; j<=LEN-2-i; j++)
        {
            if(s[j]>s[j+1])
            {
                tmp=s[j];
                s[j]=s[j+1];
                s[j+1]=tmp;
            }
        }
    }
}

//quickSort
int partition(int s[], int high, int low)
{
    int pivot;

    pivot=s[low];

    while(low<high)
    {
        while(low<high&&pivot<=s[high])
        {
            high--;
        }
        s[low]=s[high];
        while(low<high&&pivot>=s[low])
        {
            low++;
        }
        s[high]=s[low];
    }

    s[low]=pivot;

    return low;
}

void qSort(int s[], int high, int low)
{
    int pivotLoc;

    if(high>low)  //except for only 1 element
    {
        pivotLoc=partition(s,high,low);
        qSort(s,high,pivotLoc+1);
        qSort(s,pivotLoc-1,low);
    }
}

void quickSort(int s[], int LEN)
{
    qSort(s,LEN-1,0);
}

//selectSort()
void selectSort(int s[], const int LEN)
{
    int tmp;

    for(int i=0; i<LEN-1; i++)
    {
        int j=i;
        for(int k=i+1; k<LEN; k++)
        {
            if(s[k]<s[j])
            {
                j=k;
            }
        }
        if(j!=i)
        {
            tmp=s[j];
            s[j]=s[i];
            s[i]=tmp;
        }
    }
}

//heapSort()  bigHeap
void heapAdjust(int s[], int node, int len)
{
    int largeIndex=-1;
    int lc,rc;
    int tmp;

    lc=node*2;
    rc=node*2+1;

    if(lc<=len && s[lc]>s[node])
    {
        largeIndex=lc;
    }
    else
    {
        largeIndex=node;
    }

    if(rc<=len && s[rc]>s[largeIndex])
    {
        largeIndex=rc;
    }

    if(largeIndex!=node)
    {
        tmp=s[largeIndex];
        s[largeIndex]=s[node];
        s[node]=tmp;

        heapAdjust(s,largeIndex,len);
    }

}

void heapSort(int s[], int len)  //1...len
{

    int index=(len)/2;
    int tmp;

    //build heap
    for(int i=index; i>=1; i--)
    {
        heapAdjust(s,i,len);
    }

    //sort
    for(int i=len; i>1; i--)
    {
        tmp=s[i];
        s[i]=s[1];
        s[1]=tmp;

        heapAdjust(s,1,i-1);
    }
}

//merge Sort
void merge(int s[], int low, int mid, int high)   //low...mid   mid+1...high
{
    int left[mid-low+1], right[high-mid];
    int ss,ls,le,rs,re;

    ss=low;
    ls=0;
    le=mid-low;
    rs=0;
    re=high-mid-1;

    for(int i=low; i<=mid; i++)
    {
        left[i-low]=s[i];
    }
    for(int i=mid+1; i<=high; i++)
    {
        right[i-mid-1]=s[i];
    }

    while(ls<=le && rs<=re)
    {
        if(left[ls]<right[rs])
        {
            s[ss]=left[ls];
            ls++;
        }
        else
        {
            s[ss]=right[rs];
            rs++;
        }
        ss++;
    }

    while(ls<=le)
    {
        s[ss]=left[ls];
        ss++;
        ls++;
    }
    while(rs<=re)
    {
        s[ss]=right[rs];
        ss++;
        rs++;
    }
}

void mSort(int s[], int low, int high)
{
    if(high>low)
    {
        int mid=(high+low)/2;

        mSort(s,low,mid);
        mSort(s,mid+1,high);
        merge(s,low,mid,high);
    }
}

void mergeSort(int s[], int LEN)
{
    mSort(s,0,LEN-1);
}

void shellSortChai(int *a,const int length){
     int i,j,k,h;
     int temp;

     h=1;
     while(h<length)
         h=3*h+1;

     while(h>0){
         h=h/3;
         for(i=0;i<h;i++){
             for(j=h;j<length;j+=h)
                for(k=j;j>0&&a[j]<a[j-h];j-=h){
                temp = a[j];
                a[j] = a[j-h];
                a[j-h] = temp;
                }
         }
     }
}

int main()
{
    int s[LEN];
    runClock aClock;

#if DEBUG_INSERT
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"insertSort:";
    aClock.clear();
    aClock.start();
    insertSort(s,LEN);
    //print(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
#endif

#if DEBUG_SHELL
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"shellSort:";
    aClock.clear();
    aClock.start();
    shellSort(s,LEN);
    //print(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
#endif

#if DEBUG_BUBBLE
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"bubbleSort:";
    aClock.clear();
    aClock.start();
    bubbleSort(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
    //print(s,LEN);
#endif

#if DEBUG_QUICK
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"quickSort:";
    aClock.clear();
    aClock.start();
    quickSort(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
    //print(s,LEN);
#endif

#if DEBUG_SELECT
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"selectSort:";
    aClock.clear();
    aClock.start();
    selectSort(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
    //print(s,LEN);
#endif

#if DEBUG_HEAP
    cout<<"init:";
    init(s,LEN);
    int headSrc[LEN+1];
    memcpy(headSrc+1,s,LEN*sizeof(int));
    //print(headSrc+1,LEN);
    cout<<"heapSort:";
    aClock.clear();
    aClock.start();
    heapSort(headSrc,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
    //print(headSrc+1,LEN);
#endif

#if DEBUG_MERGE
    cout<<"init:";
    init(s,LEN);
    //print(s,LEN);
    cout<<"mergeSort:";
    aClock.clear();
    aClock.start();
    mergeSort(s,LEN);
    aClock.end();
    printf("\ntime:%lf\n",aClock.result());
    //print(s,LEN);
#endif

    return 0;
}

 

 

#ifndef RUNCLOCK_H_INCLUDED
#define RUNCLOCK_H_INCLUDED
#include <ctime>

class runClock
{
    public:
        runClock();
        void start();
        void end();
        double result();
        void clear();
    private:
       clock_t startTime, endTime;
};


#endif // RUNCLOCK_H_INCLUDED

  

 

#include "runClock.h"

runClock::runClock()
{
    startTime=0.0;
    endTime=0.0;
}

void runClock::start()
{
    startTime=clock();
}

void runClock::end()
{
    endTime=clock();
}

double runClock::result()
{
    return double(endTime-startTime)/CLOCKS_PER_SEC;
}

void runClock::clear()
{
    startTime=0.0;
    endTime=0.0;
}

  

运行结果:

 

posted on 2012-05-02 23:39  Eric-Yang  阅读(191)  评论(0编辑  收藏  举报