美文网首页
c语言归并排序

c语言归并排序

作者: 一路向后 | 来源:发表于2021-03-28 00:03 被阅读0次

1.源码实现

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

#define min(x, y) ((x < y ? x : y))

/* 归并排序: 迭代法 
 * 1.申请空间, 使其大小为两个已经排序序
 *   列之和, 该空间用来存放合并后的序列
 * 2.设定两个指针, 最初位置分别为两个已
 *   经排序序列的起始位置.
 * 3.比较两个指针所指向的元素, 选择相对
 *   较小的元素放入到合并空间, 并移动指
 *   针到下一位置.
 * 4.重复步骤3, 直到某一指针到达序列尾.
 * 5.将另一序列剩下的所有元素直接复制到
 *   合并序列尾.                         */

void merge(int *arr, int len)
{
    int *a = arr;
    int *b = (int *)malloc(len * sizeof(int));  /*步骤1*/
    int seg;
    int start;
    int i;
    int *temp;

    for(seg=1; seg<len; seg+=seg)
    {
        for(start=0; start<len; start+=seg+seg)
        {
            int low = start;
            int mid = min(start+seg, len);
            int high = min(start+seg+seg, len);
            int k = low;

            /*步骤2*/
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;

            /*步骤3和步骤4*/
            while(start1 < end1 && start2 < end2)
            {
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            }

            /*步骤5*/
            while(start1 < end1)
            {
                b[k++] = a[start1++];
            }

            /*步骤5*/
            while(start2 < end2)
            {
                b[k++] = a[start2++];
            }
        }

        temp = a;
        a = b;
        b = temp;
    }

    if(a != arr)
    {
        for(i=0; i<len; i++)
        {
            b[i] = a[i];
        }

        b = a;
        a = arr;
    }

    free(b);
}

void print(int *a, int n)
{
    int i = 0;

    for(i=0; i<n; i++)
    {
        printf("%d ", a[i]);
    }

    printf("\n");
}

int main()
{
    int a[] = {40, 8, 15, 18, 12};

    merge(a, 5);

    print(a, 5);

    return 0;
}

2.编译源码

$ gcc -o example example.c -std=c89

3.运行及其结果

$ ./example
8 12 15 18 40

相关文章

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

    插入排序、希尔排序、堆排序、归并排序 --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/tpvuhltx.html