数据结构八种排序方法作业示例(无讲解)

#include <cstdio>

#include <cstring>

#include <ctime>

#include <algorithm>

#include <cstdlib>

#include <cmath>

#include <fstream>

using namespace std;



class insertSort{

public:

    insertSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~insertSort(){

        delete b;

    }



    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);

        for(int i = 0;i<size; i++){

          //  printf("%d\n",a[i]);

          //  int minind = i;

            int j = i;

            for(j = i-1;j>=0;j--){

                compTime++;

                if(b[j]<=b[i]){

                    break;

                }

            }

            if(b[j]<=b[i]||j<0)j++;//要插入位置

            int tmp = b[i];

            for(int k = i;k>j;k--){

                    b[k] = b[k-1];

                    swapTime ++;

            }

            b[j] = tmp;

        }

        stop= time(&stop);

    }



    void print(){

        puts("1 直接插入排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class halfInsertSort{

public:

    halfInsertSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~halfInsertSort(){

        delete b;

    }



    void sort(){

       for(int i=0;i<size;i++)b[i]=a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);

        for(int i = 0;i<size; i++){

            int l=0,r=i;

            while(r-l>1){

                int mid = (l+r)>>1;

                if(b[mid] > b[i]){

                    r = mid;

                }

                else {

                    l = mid;

                }

                compTime++;

            }

            if(b[l]<=b[i])l++;

            int tmp = b[i];

            for(int k = i;k>l;k--){

                    b[k]=b[k-1];

                    swapTime ++;

            }

            b[l]=tmp;

        }

        stop= time(&stop);

    }



    void print(){

        puts("2 折半插入排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class shellSort{

public:

    shellSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~shellSort(){

        delete b;

    }



    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);



        int times = int(log2(size+1));

        for(int i = 1;i <=times;i++){

            int d = int(pow(2,times-i+1)-1);

            for(int j = 0;j < size;j++){

                int tmp = b[j];

                int k;

                for(k= j-d;k>=0&&++compTime&&b[k]>tmp;k-=d){

                    b[k+d] = b[k];swapTime++;

                }

                k+=d;

                b[k] = tmp;

            }

        }





        stop= time(&stop);

    }



    void print(){

        puts("3 Shell排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class bubbleSort{

public:

    bubbleSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~bubbleSort(){

        delete b;

    }



    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);

        for(int i = 0;i<size; i++){

                for(int j = size - 1;j > i; j--){

                    compTime++;

                    if(b[j]<b[j-1]){

                            swap(b[j-1],b[j]);

                            swapTime+=3;

                    }

                }

        }

        stop= time(&stop);

    }



    void print(){

        puts("4 冒泡排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class quickSort{

public:

    quickSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~quickSort(){

        delete b;

    }

    void partition2(int s,int t){

        int low = s,high = t;

        int key = b[s];

        while(low < high){

            while(low<high&&high--&&b[high] >= key){compTime++;}

            if(low==high)break;

            b[low] = b[high];

            swapTime++;

            while(low<high&&low++&&b[low]<=key){compTime++;}

            if(low==high)break;

            b[high] = b[low];

            swapTime++;

        }

        b[low] = key;

        if(low>s+1)partition2(s,low);

        if(low+1<t)partition2(low+1,t);

    }

    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);



        partition2(0,size);



        stop= time(&stop);

    }



    void print(){

        puts("5 快速排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class simpleSelectSort{

public:

    simpleSelectSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~simpleSelectSort(){

        delete b;

    }

    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);



        for(int i=0;i<size;i++){

            int minind =i;

            for(int j=i+1;j<size&&++compTime;j++){

                if(b[minind]>b[j]){

                    minind = j;

                }

            }

            if(i!=minind){

                    swap(b[minind],b[i]);

                    swapTime+=3;

            }

        }



        stop= time(&stop);

    }



    void print(){

        puts("6 简单选择排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class heapSort{

public:

    heapSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~heapSort(){

        delete b;

    }

    void heapAdjust(int i,int size){

        int lchild = 2*i;

        int rchild = 2*i+1;

        int mx = i;

        if(i<=size/2){

            if(lchild<size&&b[lchild]>b[mx]){

                mx = lchild;

                compTime++;

            }

            if(rchild<size&&b[rchild]>b[mx]){

                mx = rchild;

                compTime++;

            }

        }

        if(mx!=i){

            swapTime+=3;

            swap(b[mx],b[i]);

            heapAdjust(mx,size);

        }

    }

    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);

        for(int i = size/2;i>=0;i--){

            heapAdjust(i,size);

        }

        for(int i = size;i>0;i--){

            swap(b[0],b[i-1]);

            heapAdjust(0,i-1);

        }

        stop= time(&stop);

    }



    void print(){

        puts("7 堆排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};



class mergeSort{

public:

    mergeSort(int * a,int size){

        this->a = a;

        this->size = size;

        b = new int[size];

    }

    ~mergeSort(){

        delete b;

    }

    void merge(int s,int t){

        //printf("s %d t %d\n",s,t);

        int mid = (s+t)>>1;

        if(s+1<mid)merge(s,mid);

        if(t>mid+1)merge(mid,t);

        int* tmp = new int[t-s+1];

        int i = s,j = mid,k = s;

        while(k<t){

            if(i<mid&&j<t){

                compTime++;

                if(b[i]<b[j])tmp[k++-s]=b[i++];

                else  tmp[k++-s]=b[j++];

            }

            else if(i<mid){

                tmp[k++-s]=b[i++];

            }

            else{

                tmp[k++-s]=b[j++];

            }

            swapTime ++;

        }

        while(--k>=s){

                b[k]=tmp[k-s];swapTime++;

        }

      //  print();

        delete tmp;

    }

    void sort(){

        for(int i =0;i<size;i++)b[i] =a[i];

        swapTime = 0;

        compTime = 0;

        start = time(&start);



        merge(0,size);



        stop= time(&stop);

    }



    void print(){

        puts("8 归并排序");

        puts("展示结果");

        for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');

        printf("关键字比较次数:%d\n",compTime);

        printf("关键字排序次数:%d\n",swapTime);

        printf("用时:%ld ms\n",stop-start);

    }

    int swapTime;

    int compTime;

private:

    int * a;

    int * b;

    int size;

    time_t start,stop;



};





int printInstruction(){

    puts("*************************************************");

    puts("0 退出");

    puts("1 直接显示结果");

    puts("2 比较八种不同排序");

    puts("3 重新生成数据");

    puts("*************************************************");

    int op;

    scanf("%d",&op);

    return op;

}

class generator{

    public:

    generator(){

        this->size = 200;

        this->bon = 200;

        a = new int[size];

        for(int i= 0;i<size;i++){

            a[i] = rand()*bon/RAND_MAX;

        }

    }

    generator(int size,int bon){

        this->size = size;

        this->bon = bon;

        a = new int[size];

        for(int i= 0;i<size;i++){

            a[i] = rand()*bon/RAND_MAX;

        }

    }

    ~generator(){

        delete a;

    }

    void print(){

        printf("容量:%d 生成数最大值:%d %p\n",size,bon,a);

        for(int i =0;i<size;i++)printf("%d%c",a[i],i==size-1?'\n':' ');

    }

    int* a;

    int size;

    int bon;

};

void sortPrint(generator * g){

    insertSort * sort1=new insertSort(g->a,g->size);

    halfInsertSort * sort2 = new halfInsertSort(g->a,g->size);

    shellSort * sort3 = new shellSort(g->a,g->size);

    bubbleSort * sort4 = new bubbleSort(g->a,g->size);

    quickSort * sort5 = new quickSort(g->a,g->size);

    simpleSelectSort* sort6 = new simpleSelectSort(g->a,g->size);

    heapSort * sort7 = new heapSort(g->a,g->size);

    mergeSort * sort8 = new mergeSort(g->a,g->size);



    ofstream out("data.txt");

    sort1->sort();

    sort1->print();

    out<<"("<<sort1->compTime<<","<<sort1->swapTime<<") ";

    sort2->sort();

    sort2->print();

    out<<"("<<sort2->compTime<<","<<sort2->swapTime<<") ";

    sort3->sort();

    sort3->print();

    out<<"("<<sort3->compTime<<","<<sort3->swapTime<<") ";

    sort4->sort();

    sort4->print();

    out<<"("<<sort4->compTime<<","<<sort4->swapTime<<") ";

    sort5->sort();

    sort5->print();

    out<<"("<<sort5->compTime<<","<<sort5->swapTime<<") ";

    sort6->sort();

    sort6->print();

    out<<"("<<sort6->compTime<<","<<sort6->swapTime<<") ";

    sort7->sort();

    sort7->print();

    out<<"("<<sort7->compTime<<","<<sort7->swapTime<<") ";

    sort8->sort();

    sort8->print();

    out<<"("<<sort8->compTime<<","<<sort8->swapTime<<") ";

    out<<endl;



    delete sort1;

    delete sort2;

    delete sort3;

    delete sort4;

    delete sort5;

    delete sort6;

    delete sort7;

    delete sort8;

}

int main(){

    generator* g = new generator();



    int op;

    while((op=printInstruction())!=0){

        switch(op){

        case 1:

            g->print();

            break;

        case 2:

            sortPrint(g);

            break;

        case 3:

            delete g;

            int sz,bon;

            puts("请输入样本容量");

            scanf("%d",&sz);

            puts("请输入随机生成数最大值");

            scanf("%d",&bon);

            g = new generator(sz,bon);

            g->print();

            break;

        default:

            break;

        }

    }

    delete g;

    return 0;

}

  

你可能感兴趣的:(数据结构)