美文网首页
归并排序

归并排序

作者: QinRenMin | 来源:发表于2018-06-21 13:28 被阅读0次

    计算机算法设计分析可以说是进入到复习阶段了,当然也可以说成是自习阶段,归并排序已经学过有一段时间了。学习的时候没有坚持写笔记,后来挺痛苦的,看来还是要养成做总结的好习惯。同志们一起复习总结哟!
    现在聊聊归并排序吧。

    • 首先,假如有两个有序的数组,我们要让它合并成一个有序的数组,应该如何处理呢?
      代码如下:
    void MemeryArray(int a[], int n, int b[], int m, int c[])  
    {  
        int i, j, k;  
      
        i = j = k = 0;  
        while (i < n && j < m)  
        {  
            if (a[i] < b[j])  
                c[k++] = a[i++];  
            else  
                c[k++] = b[j++];   
        }  
      
        while (i < n)  
            c[k++] = a[i++];  
      
        while (j < m)  
            c[k++] = b[j++];  
    } 
    

    以上是借助了第三个数组,那么,如果将一个无序的数组进行排序,就可以将这个数组分成两部分,使每部分都有序,然后再进行排序与合并,就可以实现整体有序。

    • 具体代码,表示使用JS写的,不过是按照c语言思想表达出来的,没有借助与js函数,主要是体现思想,有兴趣的话,可以用java/c等同样表达出来。
    function sortIt(s,first,mid,last,temp) {
        let i = first;
        let j = mid + 1;
        let m = mid;
        let n = last;
        let k = 0;
        while (i <= m && j <= n){
            if(s[i] < s[j]) {
                temp[k++] = s[i++];
            }
            else temp[k++] = s[j++];
        }
        while (i <= m){
            temp[k++] = s[i++];
        }
        while (j <= n) {
            temp[k++] = s[j++];
        }
        for(i = 0; i < k; i++)
        {
            a[i+first] = temp[i];//将排好顺序的部分放在数组a中
        }
    }
    function mergeSort(a,first,last,temp) {
        if(first < last) {
    
            let mid =parseInt((first + last) / 2) ; //转化为int型
            mergeSort(a,first,mid,temp); //使左边有序
            mergeSort(a,mid + 1, last,temp);//使右边有序
            sortIt(a,first,mid,last,temp);//合并两个有序的
        }
    }
    let a = [5,3,1,9,8,2,4];
    let  temp = [];
    mergeSort(a,0,a.length-1,temp);
    console.log(a);
    

    可以动手走一下过程,会有很大的收获。

    相关文章

      网友评论

          本文标题:归并排序

          本文链接:https://www.haomeiwen.com/subject/wkmqyftx.html