zoukankan      html  css  js  c++  java
  • Algorithms

    印象

    图1 使用合并排序为一列数字进行排序的过程

    思想

    归并排序是典型的分治算法,它不断地将某个数组分为两个部分,分别对左子数组与右子数组进行排序,然后将两个数组合并为新的有序数组。

    分析

    • 稳定: 是
    • 时间复杂度:
      • 最优时间: O(nlog(n))
      • 最坏时间: O(nlog(n))
      • 平均时间: O(nlog(n))

    实例代码

    C#

    public static List<int> sort(List<int> lst) {
        if (lst.Count <= 1)
            return lst;
        int mid = lst.Count / 2;
        List<int> left = new List<int>();  // 定义左侧List
        List<int> right = new List<int>(); // 定义右侧List
        // 以下兩個循環把 lst 分為左右兩個 List
        for (int i = 0; i < mid; i++)
            left.Add(lst[i]);
        for (int j = mid; j < lst.Count; j++)
            right.Add(lst[j]);
        left = sort(left);
        right = sort(right);
        return merge(left, right);
    }
    /// <summary>
    /// 合併兩個已經排好序的List
    /// </summary>
    /// <param name="left">左側List</param>
    /// <param name="right">右側List</param>
    /// <returns></returns>
    static List<int> merge(List<int> left, List<int> right) {
        List<int> temp = new List<int>();
        while (left.Count > 0 && right.Count > 0) {
            if (left[0] <= right[0]) {
                temp.Add(left[0]);
                left.RemoveAt(0);
            } else {
                temp.Add(right[0]);
                right.RemoveAt(0);
            }
        }
        if (left.Count > 0) {
            for (int i = 0; i < left.Count; i++)
                temp.Add(left[i]);
        }
        if (right.Count > 0) {
            for (int i = 0; i < right.Count; i++)
                temp.Add(right[i]);
        }
        return temp;
    }
    

    推荐

    博客园 - 图解排序算法(四)之归并排序

    参考

    Wikipedia - Merge sort

  • 相关阅读:
    汇编指令lodsb和stosb、lodsd和stosd
    编码查询
    CLD汇编指令
    Win32编程
    MessageBox
    windows 数据类型
    STL总结
    解析结构化异常处理(SEH)(第二部分)
    FS[XX]
    ShellCode入门(提取ShellCode)
  • 原文地址:https://www.cnblogs.com/zdfffg/p/10432202.html
Copyright © 2011-2022 走看看