归并排序(c语言)

归并算法(merge sorting)是一种基于分治思想的排序算法,将数据细分为小块处理,再将排序后的小块合并成为排序大块,通过递归最终合并为一个排好序的序列,从而达到排序功能。

归并排序属于稳定快速的排序算法之一,其时间复杂度为o(n*logn)。

归并的含义是将两个或两个以上已排好序的序列合并成为一个新的排序序列的过程。

因此归并排序算法由两个核心函数组成,

【1】merge_sort函数负责递归,将一个整序列拆分成为小块序列,一直拆到每个小块只有一个数的时候,将两个小块传给merge函数得到大块。

【2】merge函数负责排序,将两个已经排序的小块重新排序合并为一个大块(在小块被拆分到最小的情况下,一个小块只含有一个数据,此时只要将这两个数据排序合并即可)。 

//需要用到的参数由一个int类型数组,以及需要进行排序的区间
void merge_sort(int* arr, int head, int tail)
{
    if(head >= tail) return;
    //此时传入数组的第一个元素位置和最后一个元素重合甚至在其之后
    //说明其已经分到了最小块,只有一个元素,直接返回

    int mid = (head + tail) /2;
    //将数组粗暴的拆分为两块,利用递归将拆开后的两块继续进行拆分
    merge_sort(arr,head,mid);
    merge_sort(arr,mid+1,tail);

    //merge_sort函数在merge函数的前面
    //在merge处理数据时,数据是已经进行过两次merge_sort的数据
    merge(arr,head,tail);
}
//此刻传入的参数有数组,需要进行排序的区间
void merge(int* arr, int head, int tail)
{
    int mid = (head + tail) /2;
    int i = head, j = mid +1;
    //记此时第一个序列的第一号元素的位置为i
    //记此时第二个序列的第一号元素的位置为j
    
    int len = tail - head + 1;
    int* tmp = (int*)malloc(sizeof(int)*len);//tmp数组存放排好序的数值
    int count =0;
    while(i <=mid && j <= tail)
    {
        //此时为升序排列,即数值较小的元素位于左边
        //若要使其成为降序排列,将'<'改为'>'即可
        if(arr[i] < arr[j])
        {
            tmp[count++] = arr[i++];
        }
        else tmp[count++] = arr[j++];
    }
    //让数值更小的元素先进入数组tmp
    //若在一个序列的元素全部进入tmp数组后
    //将剩下那个序列的全部元素依次放进tmp数组中,因为两个序列都是以及排好序的序列
    while(i <=mid) tmp[count++] = arr[i++];
    while(j 

至此,以上两个核心函数以及全部完成。在使用过程中需要注意的是:

1、merge_sort 函数需要传入的参数有,(1)排序数组(2)排序区间起点(3)排序区间结束点,因此处理的数组长度是已知的,也可以由此改进将每次merge函数中都要申请的tmp数组放到全局变量,在main函数中为其申请空间

2、对于长度未知的数组排序,需要写入其他函数先获取其数组长度再进行排序处理

你可能感兴趣的:(c语言,排序算法)