博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序算法——归并排序
阅读量:4095 次
发布时间:2019-05-25

本文共 1333 字,大约阅读时间需要 4 分钟。

算法描述

归并排序使用递归分治的思想,先递归划分子问题,然后合并结果。假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序列表:再两两归并,…….,重复,直到得到一个长度为n的有序序列

具体步骤如下:

  1. 将所要进行排序的序列分为左右两部分,将要排序的序列起始元素下标赋给left, 最后一个元素下标赋给right
  2. 将上面所得的两部分序列继续按照步骤1进行划分,直到划分的区间长度为1
  3. 将划分结束后的序列进行归并排序,排序的方法为对所分的n个子序列进行两两合并,直到得到1个长度为n的有序序列

算法分析

空间复杂度:O(n)

时间复杂度:O(nlogn)

/*C语言实现*/void merge(int arr[], int left, int mid, int right){    int i = left, j = mid + 1, k = 0;    //分配存储空间,用于存储合并后的数组    int *tmp = (int *)malloc(sizeof(int) * (right - left + 1)));    assert(tmp);    /*合并两个子序列*/    while(i <= mid && j <= right)    {        if(a[i] < a[j])        {            tmp[k] = a[i];            k++;            i++;        }        else        {            tmp[k++] = a[j++];            k++;            j++;        }    }    /*将其中一个剩余数据复制到临时数组*/    while(i <= mid)    {        tmp[k] = a[i++];        k++;        i++;    }    while(j <= right)    {        tmp[k] = a[j];        k++;        j++;    }    /**/    for(k = 0, i = left; i <= right; i++, k++)    {        a[i] = tmp[k];    }    free(tmp);    return;}void mergesort(int a[], int left, int right){    int mid = 0;    if(left < right)    //当左边小于右边,继续执行递归操作    {        mid = (left + right) / 2        mergesort(a, left, mid);        mergesort(a, mid + 1, right);        merge(a, left, mid, right);    }    else        return; /*递归终止*/}

转载地址:http://cboii.baihongyu.com/

你可能感兴趣的文章
iOS应用间相互跳转
查看>>
iOS开发之支付宝集成
查看>>
iOS开发 支付之银联支付集成
查看>>
iOS开发支付集成之微信支付
查看>>
浅谈JavaScript--声明提升
查看>>
React非嵌套组件通信
查看>>
Websocket 使用指南
查看>>
浏览器兼容性问题解决方案 · 总结
查看>>
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
Koa2初体验
查看>>
Koa 2 初体验(二)
查看>>
Koa2框架原理解析和实现
查看>>
vue源码系列文章good
查看>>
你不知道的Virtual DOM
查看>>
VUE面试题总结
查看>>
写好JavaScript条件语句的5条守则
查看>>
原生JS中DOM节点相关API合集
查看>>
【TINY4412】U-BOOT移植笔记:(7)SDRAM驱动
查看>>
C++虚函数的总结
查看>>