zoukankan      html  css  js  c++  java
  • 排序算法分析与设计实验

    实验内容

    分别针对随机生成的三组整数序列(规模为1000个数、10000个数、100000个数)进行排序,排序算法使用以下五种经典的方法,分别是:冒泡排序算法,选择排序算法,插入排序算法,归并排序算法和快速排序算法。

    实验目的

    • 回顾并熟悉常用的排序算法。

    • 通过实验体会算法设计对问题求解效率所产生的深刻影响。

    算法设计的基本思路

      选择排序

        在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环 到倒数第二个数和最后一个数比较为止。

    直接插入排序

        在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

    冒泡排序

    在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    归并排序算法

      合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,直到得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。

    快速排序

        快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧) 的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

    程序清单

    #include<stdlib.h>

    #include<stdio.h>

    #include<ctime>

    #include<iostream>

    using namespace std;

    void Swap(int &X,int &Y) //两个数交换

    {int temp;

     temp=X;

     X=Y;

     Y=temp;

    }

    /**************************************起泡排序法****************************/

    void BubbleSort(int R[],int Length)

    {

        int i,j,t;

        i=Length-1;

      while(i>0)

       {t=0;

        for(j=0;j<i;j++)

          if(R[j+1]<R[j])

           {Swap(R[j],R[j+1]);

            t=j;

           }

         i=t;

        }

    }

    /*******************************直接选择排序法********************************/

    void SelectionSort(int R[],int Length)

    {int min,i,j;

     for(i=0;i<Length;i++)

     {min=i;

        for(j=i+1;j<Length;j++)

            if(R[j]<R[min])min=j;

         Swap(R[i],R[min]);

     }

    }

    /********************************直接插入排序法*******************************/

    void InsertionSort(int R[],int Length)

    {int i,j,k;

      for(i=1;i<Length;i++)

      {

          if(R[i]<R[i-1])

          {k=R[i];

           j=i-1;

           do{

               R[j+1]=R[j];

               j--;

              }while(j>=0&&k<R[j]);

              R[j+1]=k;

          }

      }

    }

    /********************************归并排序法**********************************/

    void Merge(int L1[],int L2[],const int left,const int mid,const int right)

    //两个子序列合并成一个组列

    {

        for(int k=left;k<=right;k++)

          L2[k]=L1[k];

        int s1=left,s2=mid+1,t=left;    // s1,s2是检测指针,t是存放指针

        while(s1<=mid&&s2<=right)           //两个数组都未检测完,两两比较

           if(L2[s1]<=L2[s2])L1[t++]=L2[s1++];

           else L1[t++]=L2[s2++];

           while(s1<=mid)L1[t++]=L2[s1++];    //若第一个数组为检测完,复制

           while(s2<=right)L1[t++]=L2[s2++];   //若第二个数组为检测完,复制

    }

    void MergeSort(int L[],int L2[],int left,int right)

    {

        if(left>=right)return;

        int mid=(left+right)/2;       //从中间划分为两个子序列

        MergeSort(L,L2,left,mid);        //对左侧子序列进行递归排序

        MergeSort(L,L2,mid+1,right);     //对右侧子序列进行递归排序

        Merge(L,L2,left,mid,right);         //合并

    }

    /*******************************快速排序法************************************/

    int Partition(int L[],int low,int high)//将序列划分成两个子序列

    { int temp;

        L[0]=L[low];           //基准元素

        temp=L[low];

        while(low<high)          //检测整个序列,进行划分

        { while(low<high&&L[high]>=temp)--high;

          L[low]=L[high];                   //小于基准元素,交换到左边

           while(low<high&&L[low]<=temp)++low;

           L[high]=L[low];                 //大于基准元素放右边

        }

        L[low]=L[0];

        return low;             //返回基准元素

    }

    void QuickSort(int R[],int left,int right) //快速排序

    {   int pivotloc;

        if(left<right)

        {pivotloc=Partition(R,left,right);//找中间值划分

           QuickSort(R,left,pivotloc-1);//递归左边

           QuickSort(R,pivotloc+1,right);//递归右边

        }

    }

    void Exchange(int B[],int C[],int Length)//两个数组值交换

    {   int k;

        for(k=0;k<Length;k++)

          B[k]=C[k];

    }

    void Print(int R[],int length)//输出序列

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

      cout<<R[i]<<"   ";

      cout<<endl;

    }

    int main()

    {  int i,j;

       int A[100000]={0};int N[100000]={0};

       int R[]={1000,10000,100000};

       double start,finish,duration;

       srand(time(0));

       for(j=0;j<3;j++)

       { cout<<endl<<R[j]<<"个数五种排序用时情况"<<endl;

         for(i=0;i<R[j];i++)

          {  A[i]=rand()%R[j];

            N[i]=A[i];

          }

         //Print(A,R[j]);

        start=clock();

        BubbleSort(A,R[j]);

        finish=clock();

        duration=(finish-start)/CLOCKS_PER_SEC*1000;

        cout<<" BubbleSort need the time:"<<duration<<endl;

        //Print(A,R[j]);

        Exchange(A,N,R[j]);//保证排序用同一数组

        start=clock();

        SelectionSort(A,R[j]);

        finish=clock();

        duration=(finish-start)/CLOCKS_PER_SEC*1000;

        cout<<" SelectionSort need the time:"<<duration<<endl;

        //Print(A,R[j]);

        Exchange(A,N,R[j]);

        start=clock();

         InsertionSort( A,R[j]);

        finish=clock();

        duration=(finish-start)/CLOCKS_PER_SEC*1000;

        cout<<" InsertionSort need the time:"<<duration<<endl;

        //Print(A,R[j]);

        Exchange(A,N,R[j]);

        start=clock();

         MergeSort(A,N,0,R[j]-1);

        finish=clock();

        duration=(finish-start)/CLOCKS_PER_SEC*1000;

        cout<<" MergeSort need the time:"<<duration<<endl;

        //Print(A,R[j]);

        Exchange(A,N,R[j]);

        start=clock();

        QuickSort(A,0,R[j]-1);

        finish=clock();

        duration=(finish-start)/CLOCKS_PER_SEC*1000;

        cout<<" QuickSort need the time:"<<duration<<endl;

        //Print(A,R[j]);

       }

        return 0;

    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zshrong/archive/2009/10/26/4730468.aspx

  • 相关阅读:
    datanode报错Problem connecting to server
    使用命令查看hdfs的状态
    Access denied for user root. Superuser privilege is requ
    ElasticSearch默认的分页参数 size
    SparkStreaming Kafka 维护offset
    【容错篇】Spark Streaming的还原药水——Checkpoint
    251 Android 线性与相对布局简介
    250 Android Studio使用指南 总结
    249 如何解决项目导入产生的中文乱码问题
    248 gradle更新问题
  • 原文地址:https://www.cnblogs.com/anorthwolf/p/1624059.html
Copyright © 2011-2022 走看看