码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法

时间:2016-02-23 20:40:34      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

算法 最坏情况 平均情况/期望运行时间
插入排序 Θ(n^2) Θ(n^2)
归并排序 Θ(nlg(n)) Θ(nlg(n))
堆排序 O(nlg(n))
快速排序 Θ(n^2) Θ(n^2)(期望)
计数排序 Θ(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++;
        }
    }
}

 

排序算法

标签:

原文地址:http://www.cnblogs.com/qiusuo/p/5210990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!