二路归并排序

来源:互联网 发布:f网络用语意思是什么 编辑:程序博客网 时间:2024/06/07 04:43

递归实现

时间复杂度:O(nlgn)空间复杂度:O(1)

http://m.blog.csdn.net/allen_fan_11/article/details/9097019

这里写图片描述

思路总结:(1)先递归分割(2)再合并(把两个有序数组进行排序合并)#include<stdio.h>void merge(int arr[], int l, int mid, int r)  //合并{    int i = l;    int j = mid + 1;    int *t = new int[r - l + 1];  //开辟一个辅助数组t    int k = 0;    while (i <= mid && j <= r)  //依次比较,取小值存入t[k]    {        if (arr[i] < arr[j])        {            t[k++] = arr[i++];        }        else            t[k++] = arr[j++];    }    while (i <= mid)   //当其中一个数组遍历完成,把剩下的全部接过去    {        t[k++] = arr[i++];    }    while (j <= r)    {        t[k++] = arr[j++];    }    for (k = l,i = 0; i < r - l + 1; i++)  //把整个t数组拷贝给arr    {        arr[k] = t[i];        k++;    }}void MergeSort(int arr[], int l, int r)  //递归分割{    if (l < r)    {        int q = (l + r) / 2;        MergeSort(arr, l, q);        MergeSort(arr, q + 1, r);        merge(arr, l, q, r);    }}int main(){    int arr[] = { 71, 61, 42, 8, 9, 3, 2 };    //数组长度 = 数组元素的总个数    int length = sizeof(arr) / sizeof(arr[0]);    //传入的l,r是数组的下标值,因此是0和length-1    MergeSort(arr, 0, length - 1);    for (int i = 0; i < length; i++)        printf("%5d", arr[i]);    printf("\n");}