zoukankan      html  css  js  c++  java
  • 排序算法

    算法 最坏情况 平均情况/期望运行时间
    插入排序 Θ(n^2) Θ(n^2)
    归并排序 Θ(nlg(n)) Θ(nlg(n))
    堆排序 O(nlg(n))
    快速排序 Θ(n^2) Θ(nlg(n))(期望)
    计数排序 Θ(k+n) Θ(k+n)
    基数排序 Θ(d(k+n)) Θ(d(k+n))
    桶排序 Θ(n^2) Θ(n)(平均情况)

    插入排序

    将当前值插入到已经排好的序列中。最好的情况下是n,最差情况下是n^2。属于原址排序。

    static void InsertSort(List<int> sq)
    {
        for (int j = 1; j < sq.Count; j++)
        {
            var current = sq[j];
            int i = j - 1;
            //如果当前值大的话,不用移动,小的话,移动比他小的值
            while (i >= 0 && sq[i] > current)
            {
                sq[i + 1] = sq[i];
                i--;
            }
            sq[i + 1] = current;
        }
    }

    归并排序

    总代价总是为nlg(n)。非原址排序。

    static void Merge_Sort(List<int> sq, int s, int e)
    {
        if (s < e)
        {
            int q = (s + e) / 2;
            //分治
            Merge_Sort(sq, s, q);
            Merge_Sort(sq, q+1, e);
            //合并
            Merge(sq, s, q, e);
        }
    }
    static void Merge(List<int> sq, int s, int m, int e)
    {
        List<int> sequenceL = new List<int>();
        //拷贝分支
        for (int i = s; i <= m; i++)
            sequenceL.Add(sq[i]);
        List<int> sequenceR = new List<int>();
        for (int i = m+1; i <= e; i++)
            sequenceR.Add(sq[i]);
        //归并
        int li = 0, ri = 0;
        for (int k = s; k <= e; k++)
        {
            //另外一个分支合并完成的情况
            if (li >= sequenceL.Count)
            {
                sq[k] = sequenceR[ri];
                ri++;
                continue;
            }
            if (ri >= sequenceR.Count)
            {
                sq[k] = sequenceL[li];
                li++;
                continue;
            }
            //比较两个分支的当前元素
            if (sequenceL[li] < sequenceR[ri])
            {
                sq[k] = sequenceL[li];
                li++;
            }
            else
            {
                sq[k] = sequenceR[ri];
                ri++;
            }
        }
    }
  • 相关阅读:
    重点词笔记
    pycharm tips
    标注精简过的问题如何导入问题库
    增加权重
    word2vec训练出来的相似词歧义
    算法测试及对比度进一步增强
    Python 命名笔记
    债务重组的会计处理方法
    实质性方案与综合性方案的区别
    什么叫认定层次
  • 原文地址:https://www.cnblogs.com/qiusuo/p/5210990.html
Copyright © 2011-2022 走看看