本篇博客包括对原代码相关算法的改进以及完善,以及思想心得。

(1)博客介绍

  来源:C语言,编写程序将两一维数组合并并排序 (baidu.com)

  概要:合并两个数组并将其排序

(2)代码实现

原代码如下

#include <stdio.h>
int main()
{
int n1,n2,i,j,t;
int a[100],b[100],c[200]; //假设a,b为两有序数组且足够大
scanf("%d",&n1);
for(i=0,j=0;i<n1;i++,j++)
{
scanf("%d",&a[i]);
c[j]=a[i];
}//输入数组a,并且将其中的元素赋给数组c的前n1个元素
scanf("%d",&n2);
for(i=0,j=n1;i<n2;i++,j++)
{
scanf("%d",&b[i]);
c[j]=b[i];
}//输入数组b,并且将其中的元素赋给数组c的后n2个元素
for(i=0;i<n1+n2-1;i++)
{
for(j=0;j<n1+n2-1-i;j++)
{
    if(c[j]>c[j+1])
    {
       t=c[j];
       c[j]=c[j+1];
       c[j+1]=t;
    }
}
}//冒泡法,重新给数组c排序
for(j=0;j<n1+n2;j++)
printf("%d ",c[j]);
return 0;
}

运行成功,截图如下:

数组合并python 数组合并与排序c语言_数组合并python

 

 

 (3)代码分析、设想

          ① 原代码通过设置三个数组,将两个数组首先合并在一个数组中,在使用冒泡法进行排序。冒泡排序法进行排序时,由运行测试数据可知:

            第一趟第1次比较后的结果:2 5 1 7 4

            第一趟第2次比较后的结果:2 1 5 7 4

            第一趟第3次比较后的结果:2 1 5 7 4

            第一趟第4次比较后的结果:2 1 5 4 7

            第二趟第1次比较后的结果:1 2 5 4 7

            第二趟第2次比较后的结果:1 2 5 4 7

            第二趟第3次比较后的结果:1 2 4 5 7

            第三趟第1次比较后的结果:1 2 4 5 7

            第三趟第2次比较后的结果:1 2 4 5 7

            第四趟第1次比较后的结果:1 2 4 5 7

              从上面可知,从第二趟第 3次比较后,数组后面再进行的循环都是可以省略掉的。冒泡法平均时间复杂度为O(n*n),时间复杂度较高,当数据量较多时,效率慢。我想到,在数据结构的链表的学                  习中,第一次做链表合并的题目的我也采用了冒泡排序算法进行对合并链表进行排序,后来学习到了一种更优、效率更高的递归合并方法,同样适用于数组的合并以及排序。

              合并链表进行排序算法,首先需要输入有序数值链表,通过while循环比较两链表第一个数大小,取较小的数值放入新链表并将其指针向后移动一位,直到某条链表指针指向为空,再将有剩余的链                表接在 新链表后面,如下如所示,此算法时间复杂度为O(n),与冒泡法比较效率更高。

数组合并python 数组合并与排序c语言_数组_02

    (2)且原代码未对输入全为0做处理;

(4)代码替换、结果展示

           用上述算法进行对冒泡法排序的优化,并加上若输入全部为0的情况的处理,替换的代码如下

i=0;
j=0;
t=0;
while(i<n1||j<n2)
{
    if(a[i]<b[j])
    {
        c[t++]=a[i++];
    }
    else
    {
        c[t++]=b[j++];
    }
}
while(j<n2)
{
    c[t++]=b[j];
    j++;

}
while(i<n1)
{
    c[t++]=a[i++];
}

if((n1+n2)==0)
printf("空数组");

将此段代码替换掉冒泡排序后,运行结果如下

数组合并python 数组合并与排序c语言_冒泡法_03

 

 

数组合并python 数组合并与排序c语言_冒泡法_04

 (5)思想心得

      课程、时间有限,比多做题目本身更重要的是学会以一比三,融会贯通,算法思维比代码本身更加重要,多思考、多练习才能学的更好,走的更远,大家一起共勉。