首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

归并排序的兑现

2013-10-08 
归并排序的实现归并排序的时间复杂度和快排还有堆排序是一样的,归并排序利用了分治的思想,它的核心就是将

归并排序的实现

归并排序的时间复杂度和快排还有堆排序是一样的,归并排序利用了分治的思想,它的核心就是将两个有序的数组合并,那么我们怎么得到这两个有序的数组呢,就是将这两个数组再分为小的数组,由小的数组合并而成,是不是有种递归的赶脚?对了,归并就是,递归+合并

算法的框架像这样的:



自己实现的代码如下:

void merge_sort(int a[], int length, int *temp){    int i, left_min, left_max, right_min, right_max, next;    for(i = 1; i < length; i*=2)//自下向上分治,步长为1、2、4、8    {        for(left_min = 0; left_min < length - i; left_min = right_max)        {            right_min = left_max = left_min + i;//需要注意的是left_max = right_min            right_max = left_max + i;            if(right_max > length)                right_max = length;            next = 0;            while(left_min < left_max && right_min < right_max)//此处是<,所以上面for里面是left_min = right_max                temp[next++] = a[left_min] > a[right_min] ?a[right_min++]:                    a[left_min++];            while(left_min < left_max)                a[--right_min] = a[--left_max];            while(next > 0)                a[--right_min] = temp[--next];        }    }}

贵并排序的时间分为两个部分,分治,类似一个二分法查找,时间复杂度O(logn),合并的时候时间是O(n),总的时间就是O(nlogn),是一个稳定的排序算法,

最差,平均,最好时间都是O(nlogn)

热点排行