排序算法之二路归并排序

二路归并排序

        二路归并排序是采用的分而治之的思想。将一个待排序的序列分成两个序列,分别对这两个序列排序。而对于这两个序列排序的方式也是还之前一样,将这两个序列分别分成两个序列分别排序。一直这样分割下去,知道序列中没有元素或者已有一个元素为止。因为没有元素的序列和只有一个元素的序列定是一个有序的序列,所以相当于将这个序列排序完毕,向上返回。返回的过程中做的最重要的一件事就是将两个有序的序列合并成一个有序的序列。

        所以归并排序最重要的两步是分割和合并。

        例如:序列{50, 90, 30, 70, 40, 80, 60, 20}。这个序列进行二路归并排序的过程如下图所示:


int MergeSort(datatype *array, int low, int high)
{
    int i, j, k;
    int mid;
    int *temp;

    if(array == NULL) {
        return -1;
    }

    if(low >= high) {
        return -1;
    }
//辅助数组存两个数组有序之后合并成为的一个有序的数组
    temp = (int *)malloc(sizeof(int)*(high-low+1));
    if(temp == NULL) {
        return -1;
    }

    mid = (low + high) / 2;

//递归调用归并排序去是分割成的两个序列有序
    MergeSort(array, low, mid);
    MergeSort(array, mid+1, high);

//下面的程序是将两个有序的序列合并为一个有序的序列
    i = low;
    j = mid+1;
    k = 0;
//i指向第一个数组当前的比较值,j指向第二个数组的比较值
    while(i <= mid && j <=high) {
//比较i指向的值和j指向的值,将比较小的赋值给temp
        if(array[i] < array[j]) {
            temp[k++] = array[i++];
        } else {
            temp[k++] = array[j++];
        }
    }

//当i依旧小于mid时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第二个序列的所有的数的。将这些数全部依次赋值给temp
    while(i <= mid) {
        temp[k++] = array[i++];
    }

//当j依旧小于high时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第一个序列的所有的数的。将这些数全部依次赋值给temp
    while(j <= high) {
        temp[k++] = array[j++];
    }

//将temp中所保存的整个有序的序列赋值到原先序列的对应位置中
    for(i = 0; i <= high-low; i++) {
        array[low+i] = temp[i];
    }

    return 0;
}
 

归并排序是一种分治算法,将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序的子序列合并成整体有序序列。而二路归并排序归并排序的一种实现方式,它是将待排序序列分成两个子序列,每个子序列都是有序的,然后再将两个有序子序列合并成整体有序序列。 二路归并排序归并排序的一种特殊情况,它只是将待排序序列分成两个子序列,而不是像归并排序那样分成多个子序列。因此,二路归并排序实现相对简单,但是它的时间复杂度和归并排序一样,都是O(nlogn)。 下面是归并排序二路归并排序的Python实现归并排序: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result ``` 二路归并排序: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = arr[:mid] right = arr[mid:] left = merge_sort(left) right = merge_sort(right) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值