实验报告——直接插入排序改进的冒泡排序和归并排序实现整数数组的排序

Posted 好好学习,天天向上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验报告——直接插入排序改进的冒泡排序和归并排序实现整数数组的排序相关的知识,希望对你有一定的参考价值。

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

实验项目名称:排序

实验目的和要求:
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-路归并排序的具体实现过程如下:
技术分享图片
 

实验基本描述:

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

实验步骤:
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

 

 

























以上是关于实验报告——直接插入排序改进的冒泡排序和归并排序实现整数数组的排序的主要内容,如果未能解决你的问题,请参考以下文章

Java实现快速排序

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚

Python八大算法的实现,插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序。

八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)

常见的排序算法