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

    归并操作

    归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
    如 设有数列{6,202,100,301,38,8,1}
    初始状态:6,202,100,301,38,8,1
    第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
    第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
    第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
    总的比较次数为:3+4+4=11,;
    逆序数为14;
     

    算法描述

    归并操作的工作原理如下:
    第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
    第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
    第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    重复步骤3直到某一指针超出序列尾
    将另一序列剩下的所有元素直接复制到合并序列尾
     

    代码实现

    func mergeSort(r []int) []int {
        length := len(r)   
        if length <= 1 {
            return r 
        }   
        num := length / 2
        left := mergeSort(r[:num])   
        right := mergeSort(r[num:])   
        return merge(left, right)
    }
    func merge(left, right []int) (result []int) {   
        l, r := 0, 0   
        for l < len(left) && r < len(right) {
            if left[l] < right[r] {         
                result = append(result, left[l])         
                l++      
            } else {         
                result = append(result, right[r])         
                r++      
            }   
        }   
        result = append(result, left[l:]...)   
        result = append(result, right[r:]...)   
        return
    }
    

      

  • 相关阅读:
    Delphi XE5 for Android (六)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    如何设计并使用FireMonkeyStyle
    Indy发送邮件被kbas退掉
    Indy10收发Hotmail邮件
    一个简单的打印监控示例
    DataSnap侦听端口动态设置问题
    面试题总结一
    spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
  • 原文地址:https://www.cnblogs.com/foxy/p/9182289.html
Copyright © 2011-2022 走看看