归并排序的实现
归并排序的时间复杂度和快排还有堆排序是一样的,归并排序利用了分治的思想,它的核心就是将两个有序的数组合并,那么我们怎么得到这两个有序的数组呢,就是将这两个数组再分为小的数组,由小的数组合并而成,是不是有种递归的赶脚?对了,归并就是,递归+合并
算法的框架像这样的:
自己实现的代码如下:
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)