C语言-归并排序法

2016-02-10  本文已影响68人  MonkeyHeng
#include <stdio.h>  
#include <stdlib.h>  
  
void splitArrays();  
void sortArrays(int num[], int start, int mid, int end);  
  
int main(int argc, const char * argv[])  
{  
    int num_really[11];  
    for (int i = 0; i < 11; i++) {  
        num_really[i] = arc4random() % (90 - 10 + 1) + 10;  
    }  
    for (int i = 0; i < 11; i++) {  
        printf("%d ", num_really[i]);  
    }  
    printf("\n");  
    splitArrays(num_really, 0, 10);  
    for (int i = 0; i < 11; i++) {  
        printf("%d ", num_really[i]);  
    }  
    printf("\n");  
    return 0;  
}  
  
void splitArrays(int num[], int start, int end) {  
    int mid = (start + end) / 2;  
    if (mid != start) {  
        splitArrays(num, start, mid);  
        splitArrays(num, mid + 1, end);  
        sortArrays(num, start, mid, end);  
    } else {  
        sortArrays(num, start, mid, end);  
    }  
}  
  
void sortArrays(int num[], int start, int mid, int end) {  
      
    int num_left[mid - start + 1];  
    int num_right[end - mid];  
      
    //复制左子列  
    for (int i = 0; i < mid - start + 1; i++) {  
        num_left[i] = num[start + i];  
    }  
    //复制右子列  
    for (int i = 0; i < end - mid; i++) {  
        num_right[i] = num[mid + 1 + i];  
    }  
      
    int l_start = 0;  
    int l_end = mid - start + 1;  
    int r_start = 0;  
    int r_end = end - mid;  
    int sign = start;  
      
    while (l_start < l_end && r_start < r_end) {  
        if (num_right[r_start] < num_left[l_start]) {  
            num[sign] = num_right[r_start];  
            r_start++;  
        } else {  
            num[sign] = num_left[l_start];  
            l_start++;  
        }  
        sign++;  
    }  
      
    //对于子列最后几个的处理  
    if (l_start == l_end) {  
        for (r_start; r_start < r_end; r_start++) {  
            num[sign] = num_right[r_start];  
            sign++;  
        }  
    } else if (r_start == r_end) {  
        for (l_start; l_start < l_end; l_start++) {  
            num[sign] = num_left[l_start];  
            sign++;  
        }  
    }  
}  
上一篇 下一篇

猜你喜欢

热点阅读