IOS之C语言 (二路归并与冒泡排序)

来源:互联网 发布:68.168.16.158现在域名 编辑:程序博客网 时间:2024/06/07 06:20

        学习IOS一周时间,每天面对着电脑,刚开始学c语言,觉得蛮简单,但是昨天遇到的一个问题琢磨了一晚上都没有琢磨出来,今天看到一个关于二路归并的算法,正合适,另外附上经典C语言排序方法,冒泡排序;

     

            先说说二路归并方法的定义:就是把一定组合顺序组成的一个数组两项两项分成若干组,按同样的规律进行排序,然后排序之后再对两组两组合并排序,同样用相同的规律排序,以此递推,最终完成一个数组的排序。当然在对两组两组结合的时候,可以将合并的组分别进行冒泡排序,最终得出所想要的顺序。

        拿我遇到的难题做个例子:对两个整形数组排序,将排序结果放入到一个大的数组中。题目其实用冒泡会很简单,但是有一点点要求就是不能用冒泡排序,二路归并其实是一个很好的选择;

          首先我们可以确定的是我们需要三个数组,并且第三个数组容量必须足够容纳前两个数组;那我们就先定义三个数组;

int a1[5] = {0}; //就拿5个做例子吧

int a2[5] = {0}; 

int a3[10] = {0}; 

        接下来就先让两个数组随机产生:(当然还要有适当的输出语句)

第一组随机数: a1[5]:

printf("随机产生五个数a1[5]:  ");

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

a1[i] = arc4random() % 101 + 100;//随机数就让处于100到200之间好了,简单易懂

printf("  %d\t", a1[i]);

}

printf("\n");

第二组随机数: a2[5]:

printf("随机产生五个数a2[5]:  ");

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

a2[i] = arc4random() % 101 + 100;/

printf("  %d\t", a2[i]);

}

       接下来要做的就是分别对两个数组进行排序(这个时候就是用冒泡排序的时候)

for (int i = 0; i < 5; i++) {
printf("%d\t" ,  b[ i ]);
}
printf("\n");
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (a[j] < a[j + 1]) {
d = a[ j ];
a[ j ] = a[ j + 1 ];
a[ j + 1 ] = d;
}

if (b[j] < b[j + 1]) {
d = b[j];
b[j] = b[j + 1];
b[j + 1] = d;
}
}
}

       接下来要做的就是关键部分了:

       排序完成,先对数组输出:

for (int i = 0 ; i < 5; i++) {
printf("%d\t" , a[ i ] );
}
for (int i = 0; i < 10; i++) {
printf("%d\t", b[ i ] );
}

    分别定义三个数组的下标,以便将数组的位置进行对应起来
int x = 0 , y = 0 , z = 0;
while (x < 5 && y < 5) {
if (a[x] >= b[y]) {//需要考虑数据空间有限的问题,就是定义下标的另一个目的
c[z] = a[x]; // 满足条件后,将元素对号入座
x++;
z++; 
} else {
c[ z] = b[ y ];
y++;
z++;
}
}
          上面元素比较之后还存在没有比较的元素,可以确定,对应的元素肯定是在同一个数组里面
           因为已经比较的元素对已经转移到c数组里面,因此存在两种情况,要么,元素在a里面,要么在b里面
while (x < 5) {
c[z] = a[x];//对号入座进行输出
z++;
x++;
}
while (bi < 5) {
c[z] = b[y];
y++;
z++;
}

         已经归并完毕,接下来要做的就是依题意将c组元素全部输出
for (int i = 0; i < 20; i++) {
printf('%d\t', c[i]);
}

     其实二路归并是数据结构中一种常见的优化办法,效率高。大家学会之后在c语言,以及以后的OC之中运用,会大大提高程序的运行效率。



0 0
原创粉丝点击