zoukankan      html  css  js  c++  java
  • 实验报告——直接插入排序、改进的冒泡排序和归并排序实现整数数组的排序

    实验六:排序        原页面链接:您当前的位置:首页 > 课程实验

    实验项目名称:排序

    实验目的和要求:
    1.熟悉常用排序方法的特性。
    2.应用排序方法解决具体问题。
     
    实验原理和图例:
     
    1. 序列(13,6,3,31,9,27,5,11)直接插入排序的过程如下:
    初 始:【13】, 6, 3, 31, 9, 27, 5, 11
    第1趟:【6, 13】, 3, 31, 9, 27, 5, 11
    第2趟:【3, 6, 13】, 31, 9, 27, 5, 11
    第3趟:【3, 6, 13,31】, 9, 27, 5, 11
    第4趟:【3, 6, 9, 13,31】, 27, 5, 11
    第5趟:【3, 6, 9, 13,27, 31】, 5, 11
    第6趟:【3, 5, 6, 9, 13,27, 31】, 11
    第7趟:【3, 5, 6, 9, 11,13,27, 31】

    2. 序列 T=(21,25,49,25*,16,08)冒泡排序的具体实现过程如下:
    初 始:21,25,49, 25*,16,08
    第1趟:08,21,25, 49, 25*,16
    第2趟:08,16 ,21,25, 49, 25*
    第3趟:08,16 ,21,25, 25* ,49
    第4趟:08,16 ,21,25, 25* ,49 —— 无交换,结束
    第5趟:
     
    3. 序列 T=(49,38,65,97,76,13,27)2-路归并排序的具体实现过程如下:
    无标题.png

    实验基本描述:

    编写代码分别以直接插入排序、改进的冒泡排序和归并排序实现整数数组的排序,并分析时间复杂度。

    实验步骤:
    1.分别以直接插入排序、改进的冒泡排序和归并排序实现整数数组的排序,并分析时间复杂度;
    2.在main函数中调用执行,输入并记录输出结果验证;
    3.调试,记录出现的问题和最终的运行结果;
    4.上交电子作业、填写实验报告。

    ——————————————————————————————————————————————

    程序代码:

    无需任何输入,代码可以显示排序的过程,第三种2-路归并排序没能显示排序过程(貌似也不可以啊)!

    如需更改数据,自行更改~

    #include <iostream>
    #include<stdio.h>
    #include<math.h>
    using namespace std;
    int step0=0;  //2路-归并排序记录步数
    void print_arr1(int n,int a[],int step)  //直接插入排序,输出数组a
    {
        if(step==0)
            printf("初始 : 【");
        else
            printf("第%d趟: 【",step);
        for(int i=1;i<=n-1;i++)
         {
             printf("%2d",a[i]);
             if(i==step+1)printf("】,");
             else printf(",");
         }
         if(step+1==n)
            printf("%d】\n",a[n]);
         else printf("%d\n",a[n]);
    }
    void print_arr2(int n,int a[],int step,int k)  //冒泡排序,输出数组b
    {
        if(step==0)
            printf("初始 : ");
        else
            printf("第%d趟: ",step);
        for(int i=1;i<=n-1;i++)
         {
             printf("%02d",a[i]);
             if(i==step+1)printf(",");
             else printf(",");
         }
         if(k==0)
            printf("%02d ——无交换,结束\n第5趟:\n",a[n]);
         else printf("%02d\n",a[n]);
    }
    void print_arr3(int n,int a[])  //2-路归并排序,输出数组c
    {
        if(step0==0)
            {printf("初始关键字: ");step0=1;}
        else
            printf("%d趟输出数组为: ",step0++);  //
        int i;
        for(i=1;i<=n-1;i++)
         {
             printf("%02d,",a[i]);
         }
         printf("%02d\n",a[n]);
    
    }
    void InsertSort(int a[],int n)
    {
        int i,j,flag,step=0; //flag 表示哨兵
        print_arr1(n,a,step);
        for(i=2;i<=n;i++)
        {
            if(a[i]<a[i-1]) //小于时考虑放入子序列中的位置
            {
                flag=a[0]=a[i];  //设置监视哨
                a[i]=a[i-1];
                for(j=i-2;flag<a[j];--j)
                {
                     a[j+1]=a[j];
                }
                a[j+1]=flag;
            }
            print_arr1(n,a,++step);
        }
    }
    void BubbleSort(int b[],int n)
    {
        int i,j,k=1,step=0;
        print_arr2(n,b,step,k);
        for(i=n;i>=2;i--)
        {
            k=0;
            for(j=n-1;j>=1;j--)
            {
                if(b[j]>b[j+1])
                {
                    k=1;swap(b[j],b[j+1]);
                }
            }
            print_arr2(n,b,++step,k);
            if(k==0)
                break;
        }
    }
    void Merge(int c[],int d[],int s,int m,int t)
    {
        int i=s,j,k=s;
        for(i=s,j=m+1;i<=m&&j<=t;++k)
        {
            if(c[i]<c[j])
                d[k]=c[i++];
            else
                d[k]=c[j++];
        }
        while(i<=m)
        {
            d[k++]=c[i++];
        }
        while(j<=t)
            d[k++]=c[j++];
        for(i=s;i<=t;i++)  //将数组d中的结果保存到c中,不然下次排序时c数组仍是没有更改的
            c[i]=d[i];
    }
    void MergingSort(int c[],int d[],int s,int t)
    {
        if(s==t)
            d[s]=c[s];
        else
        {
            int m=(s+t)/2;
            MergingSort(c,d,s,m);
            MergingSort(c,d,m+1,t);
            Merge(c,d,s,m,t);  //将c数组排序归并到数组d中,然后c数组 复制d数组
    
            print_arr3(7,d);  //弱化版输出,将不按照
        }
        return ;
    }
    
    int main()
    {
        int i,j,n;
    
        printf("1.InsertSort:\n");
        int a[]={0,13,6,3,31,9,27,5,11};
        n=8;
        printf("序列(13,6,3,31,9,27,5,11)直接插入排序的过程如下:\n");
        InsertSort(a,n);
    
        printf("\n2.BubbleSort: \n");
        int b[]={0,21,25,49,25,16,8};
        printf("序列 T=(21,25,49,25,16,08)冒泡排序的具体实现过程如下:\n");
        n=6;
        BubbleSort(b,n);
    
        printf("\n3.ArrangeSort: \n");
        int c[]={0,49,38,65,97,76,13,27};
        int d[]={0,49,38,65,97,76,13,27};
        printf("序列 T=(49,38,65,97,76,13,27)2-路归并排序的具体实现过程如下:\n");
        n=8;
        MergingSort(c,d,1,8);
        return 0;
    }
    View Code(我在这里!)
     
    你不逼自己一把,你永远都不知道自己有多优秀!只有经历了一些事,你才会懂得好好珍惜眼前的时光!
  • 相关阅读:
    利用Lucene将被索引文件目录中的所有文件建立索引
    Carrot2 in action 初步印象
    Lucene建立索引搜索入门实例
    Lucene索引文件组成
    模拟浏览器登陆的基本思路与做法
    HttpWatch使用教程
    httpclient 怎么带上登录成功后返回的cookie值访问下一页面
    Google开源库-Volley的使用
    Android Material Design 学习笔记
    2015年山东省齐鲁软件大赛总结
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/8137803.html
Copyright © 2011-2022 走看看