把俩个有序的数组打印或排序

最近有个面试题挺火的——把俩个有序的数组打印或排序。刚看到这个题的时候也有点蒙,最优的算法肯定要用到有序的特性。

思考了一会发现也不是很难,假如数组是正序排列的,可以同时遍历俩个数组,将小的值进行排序,最后会遍历完一个数组,留下一个非空数组,而且剩下的值肯定大于等于已经排好序的最大值。

PHP代码之

<?php
    function sort_arr($a,$b) {
        $temp = array();
        while ($a&&$b) {
            if($a['0']<$b['0']) { 
                $temp[] = array_shift($a); 
            } else { 
                $temp[] = array_shift($b); 
            } 
        } 
        if(!empty($a)) { $temp = array_merge($temp, $a); } 
        if(!empty($b)) { $temp = array_merge($temp, $b); } 
        return $temp; 
    } 
    $a = array(1,2,3,4,5,6); 
    $b = array(2,3,4,10,10,10,10); 
    sort_arr($a, $b); 
?>

 

Python 代码之

 

def fib(a,b):
    len_a = len(a)
    c = []
    while len(a) and len(b):
        if a[0] > b[0]:
        	c.append(b.pop(0))
        else:
        	c.append(a.pop(0))
    
    if len(a):
    	c = c+a  
    
    if len(b):
    	c = c+b

    i=0
    while i<len(c):
		print(c[i])
		i = i+1    	


a = [1,2,3,4,5]
b = [2,3,4,5,6,7,8,9]

fib(a,b)

C代码之

#include &amp;lt;stdio.h&amp;gt;;
int *sort(int a[], int b[], int a_len, int b_len) {
    int *temp = malloc(a_len+b_len);

    int i=0; //标注a数组
    int j=0; //标注b数组
    int m=0; //标注新数组
    
    while (i&amp;lt;a_len&amp;amp;&amp;amp;j&amp;lt;b_len) { //重新排序 if(a[i]&amp;lt;b[j]) {
            temp[m++] = b[j++];
        } else {
            temp[m++] = a[i++];
        }
    }
    
    //将剩余的数字放在新数组后面(剩余的肯定是前面的数字大)
    if(i&amp;lt;a_len) {
        for (; i&amp;lt;a_len; i++) {
            temp[m++] = a[i];
        }
    }
    if(j&amp;lt;b_len) {
        for (; j&amp;lt;b_len; j++) {
            temp[m++] = b[j];
        }
    }
    
    return temp;
}

int main(int argc, const char * argv[]) {
    int a[4] = {2,3,11,89};
    int b[6] = {4,6,9,10,22,55};
    
    int a_len = sizeof(a) / sizeof(a[0]);
    int b_len = sizeof(b) / sizeof(b[0]);
    
    int *c = sort(a, b, a_len, b_len);
    
    int y = 0;
    for (; y&amp;lt;a_len+b_len; y++) {
        printf("%d ", c[y]);
    }
    
    return 0;
}

GO代码之

package main

import "fmt"

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	var b = [8]int{4, 5, 6, 7, 89, 100, 111, 112}
	var len_a = len(a)
	var len_b = len(b)
	var c = make([]int, len_a+len_b)

	var j = 0 //标注a数组
	var k = 0 //标注b数组
	var h = 0 //标注新数组

	    
    for j &amp;lt; len_a &amp;amp;&amp;amp; k &amp;lt; len_b { 
        if a[j] &amp;gt; b[k] {
            c[h] = b[k]
            h++
            k++
        } else {
            c[h] = a[j]
            h++
            j++
        }
    }

	if j &amp;lt; len_a {
		for i := j; i &amp;lt; len_a; i++ {
			c[h] = a[i]
			h++
		}
	}

	if k &amp;lt; len_b {
		for i := k; i &amp;lt; len_b; i++ {
			c[h] = b[i]
			h++
		}
	}

	Print(c, "c")

}

/**
 * [Print array]
 * @param {[type]} o    []int  [array]
 * @param {[type]} name string [array name]
 */
func Print(o []int, name string) {
	fmt.Printf("%s: ", name)

	for _, v := range o {
		fmt.Printf("%d ", v)
	}

	fmt.Printf("\n")
}

JackSun

JackSun

I'm a coder.

You may also like...

No Responses

  1. 胡海琳 says:

    高中时候有天中午上厕所,走到门口见一女生出来,拿着纸巾擦嘴,碰巧又打了个嗝…… http://url.cn/0SmaM6

  2. 胡海琳 says:

    网站不错!

Leave a Reply

Your email address will not be published.