美文网首页
归并排序(C语言)

归并排序(C语言)

作者: 巴巴呀呀 | 来源:发表于2018-12-11 17:23 被阅读0次

算法原理

假设序列共有n个元素,将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素,将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素,重复步骤,直到所有元素排序完毕

代码实现

#include <stdio.h>
#include <stdlib.h>

void print_arr(int arr[], int len);

void merge_sort(int arr[], int len);

void merge_arr(int left_arr[], int left_arr_len, int right_arr[], int right_arr_len);

void merge(int left_arr[], int left_arr_len, int right_arr[], int right_arr_len);

int main(int argc, const char * argv[]) {
    int arr[10] =  {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
    print_arr(arr, 10);
    merge_sort(arr, 10);
    print_arr(arr, 10);
    return 0;
}

void merge_sort(int arr[], int len) {
    if (len > 1) {
        // 分割数组
        int *left_arr = arr;
        int left_arr_len = len / 2;
        int *right_arr = arr + left_arr_len;
        int right_arr_len = len - left_arr_len;
        // 对左右数组分别排序
        merge_sort(left_arr, left_arr_len);
        merge_sort(right_arr, right_arr_len);
        // 合并两个数组
        merge(left_arr, left_arr_len, right_arr, right_arr_len);
    }
}

void merge_arr(int left_arr[], int left_arr_len, int right_arr[], int right_arr_len) {
    int *result_arr = (int *)malloc((left_arr_len+right_arr_len)*sizeof(int));
    int left_index = 0, right_index = 0, result_index = 0;
    while (left_index < left_arr_len && right_index < right_arr_len) {
        if (left_arr[left_index] < right_arr[right_index]) {
            result_arr[result_index++] = left_arr[left_index++];
        } else {
            result_arr[result_index++] = right_arr[right_index++];
        }
    }
    while (left_index < left_arr_len) {
        result_arr[result_index++] = left_arr[left_index++];
    }
    while (right_index < right_arr_len) {
        result_arr[result_index++] = right_arr[right_index++];
    }
    for (int i = 0; i < left_arr_len + right_arr_len; i++) {
        left_arr[i] = result_arr[i];
    }
    free(result_arr);
}

void print_arr(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

相关文章

  • 排序算法(插入排序、希尔排序、堆排序、归并排序)

    插入排序、希尔排序、堆排序、归并排序 --c语言实现 逐渐添加中....

  • C语言——归并排序

    数组划分为单一元素的子数组,这些子数组显然是有序的。每两个子数组合并成一个数组,直至合并为原来的数组大小

  • 归并排序(C语言)

    算法原理 假设序列共有n个元素,将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排...

  • LeetCode第4题: findMedianSortedArr

    上一题:LeetCode第3题:lengthOfLongestSubstring(C语言) 思路:利用归并排序的思...

  • C语言-归并排序法

  • c语言归并排序

    1.源码实现 2.编译源码 3.运行及其结果

  • 归并排序

    归并排序:其基本思想是分治策略,先进行划分,然后再进行合并。 假设要对数组C进行归并排序,步骤是: 1.先将C划分...

  • 说说算法那些事-归并排序

    归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and C...

  • 排序算法Java实现

    本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序...

  • 常用排序算法

    目录 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 致谢 1. 冒泡排序 C实现,从小到大 ...

网友评论

      本文标题:归并排序(C语言)

      本文链接:https://www.haomeiwen.com/subject/psuehqtx.html