(程序员面试题)归并排序

来源:互联网 发布:天刀捏脸数据女女神 编辑:程序博客网 时间:2024/06/14 20:09

归并排序是效率仅次于快速排序的一种稳定排序,缺点是需要一块额外的空间用来存放需要处理的数据,具体代码如下:

#include <stdio.h>void merge(int num[], int start, int middle, int end) {    int tmp1[10], tmp2[10];    int i, j, cur, len1, len2;    int pos1, pos2;    for (i = start, len1 = 0; i <= middle; i++, len1++) {        tmp1[len1] = num[i];    }    for (j = middle + 1, len2 = 0; j <= end; j++, len2++) {        tmp2[len2] = num[j];    }    tmp1[len1] = tmp2[len2] = 10000; // ensure the end is bigger enough, otherwise it will overflow    for (cur = start, pos1 = 0, pos2 = 0; cur <= end; cur++) {        if (tmp1[pos1] <= tmp2[pos2]) {            num[cur] = tmp1[pos1++];        } else {            num[cur] = tmp2[pos2++];        }    }    int a;    for (a = start ; a <= end; a++) {        printf("%d, ", num[a]);    }    printf("\n");}void merge_sort(int num[], int start, int end) {    if (start < end) {        int middle = (start + end)/2;        merge_sort(num, start, middle);        merge_sort(num, middle + 1, end);        merge(num, start, middle, end);    }}int main(void){    int num[] = {4,1,2,7,3,9,6,5,8};    merge_sort(num, 0, 8);    return 0;}

运行结果如下:

cheny.le@cheny-ThinkPad-T420:~$ gcc merge_sort.c
cheny.le@cheny-ThinkPad-T420:~$ ./a.out
1, 4,
1, 2, 4,
3, 7,
1, 2, 3, 4, 7,
6, 9,
5, 8,
5, 6, 8, 9,
1, 2, 3, 4, 5, 6, 7, 8, 9,

归并排序的边界处理很容易出错,需要仔细再仔细。

0 0
原创粉丝点击