码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-28 23:22:45      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:课程   isp   结束   math.h   oid   分析   归并排序   调试   body   

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

实验项目名称:排序

实验目的和要求:
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

 

 

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

标签:课程   isp   结束   math.h   oid   分析   归并排序   调试   body   

原文地址:https://www.cnblogs.com/zhazhaacmer/p/8137803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!