zoukankan      html  css  js  c++  java
  • 合并排序

    /**
    * Merge_Sort: 归并排序的递归实现
    * 注:算法导论上给出的合并排序算法
    * 递归过程是将待排序集合一分为二,
    * 直至排序集合就剩下一个元素为止,然后不断的合并两个排好序的数组
    * T(n) = O(nlgn)
    **/
    #include <stdio.h>
    #define LEN 8

    // 合并
    void merge(int a[], int start, int mid, int end)
    {
    if(start>end)
    return;
    int n1=mid-start+1;
    int n2=end-mid;
    int left[LEN],right[LEN];
    int i,j,k;
    for(i=0;i<n1;i++)
    left[i]=a[start+i];
    for(i=0;i<n2;i++)
    right[i]=a[mid+1+i];

    i=j=0;
    k=start;
    while(i<n1&&j<n2)
    {
    if(left[i]<right[j])
    a[k++]=left[i++];
    else
    a[k++]=right[j++];
    }
    while(i<n1)
    {

    a[k++]=left[i++];

    }
    while(j<n2)
    {

    a[k++]=right[j++];
    }
    }

    // merge_sort():先排序,再合并
    void merge_sort(int a[], int start, int end)
    {
    if(start<end)
    {
    int mid=(start+end)/2;
    merge_sort(a,start,mid);
    merge_sort(a,mid+1,end);
    merge(a,start,mid,end);
    printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d ",
    start, mid, mid+1, end,
    a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
    }
    }

    int main(void)
    {
    int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };
    merge_sort(a, 0, LEN-1);
    return 0;
    }

  • 相关阅读:
    Swift基础学习
    APP的线程安全
    LintCode-O(1) Check Power of 2
    LintCode-Maximum Subarray Difference
    LintCode-Subarray Sum Closest
    LintCode-Rehashing
    Lintcode-Max Tree
    LintCode-Interleaving Positive and Negative Numbers.
    LintCode-Topological Sorting
    LintCode-Rotate String
  • 原文地址:https://www.cnblogs.com/MarsMercury/p/8168904.html
Copyright © 2011-2022 走看看