星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » C#实现计数排序(CountingSort)算法
admin - 2008-6-26 14:50:00
计数排序, 基数排序, 桶排序等非比较排序算法,平均时间复杂度都是O(n). 这些排序因为其待排序元素本身就含有了定位特征,因而不需要比较就可以确定其前后位置,从而可以突破比较排序算法时间复杂度O(nlgn)的理论下限.“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
计数排序是最简单的特例,它要求待排序元素是位于0到k之间的正整数, 因而它是很特殊的情况,基本上没有特别的应用价值; 但是另一方面, 它又是基数排序的基础,或者说是一部分,所以简单的描述一下:“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
输入数组 A : 元素特征是 0-k的正整数,可以有重复值;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
输出数组 B : 输出A的一个非减序列“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
中间数组 C : 大小是k, 它的i( 0<= i <= k)索引位置存储的是A元素集合中值是k的元素的个数有关.“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
算法的基本思想是: “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
算法的C#实现是:“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
note: 该算法对上述思想做了稍微的修改, 考虑到数组起始坐标是0, 所以中间数组的大小修正为 k+1 “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// <summary>“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// counting sort“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// </summary>“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// <param name="arrayA">input array</param>“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// <param name="arrange">the value arrange in input array</param>“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
/// <returns></returns>“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
public static int[] CountingSort(int[] arrayA, int arrange){“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //array to store the sorted result, “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //size is the same with input array.“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    int[] arrayResult = new int[arrayA.Length]; “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //array to store the direct value in sorting process“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //include index 0;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //size is arrange+1;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    int[] arrayTemp = new int[arrange+1]; “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //clear up the temp array“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    for(int i = 0; i <= arrange; i++)“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    {“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        arrayTemp = 0;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    } “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //now temp array stores the count of value equal“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    for(int j = 0; j < arrayA.Length; j++)“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    {“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        arrayTemp[arrayA[j]] += 1;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    } “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //now temp array stores the count of value lower and equal“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    for(int k = 1; k <= arrange; k++)“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    {“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        arrayTemp[k] += arrayTemp[k - 1];“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    } “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    //output the value to result“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    for (int m = arrayA.Length-1; m >= 0; m--)“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    {“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        arrayResult[arrayTemp[arrayA[m]] - 1] = arrayA[m];“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        arrayTemp[arrayA[m]] -= 1;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    } “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    return arrayResult;“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
}“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
简单的测试程序:“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
static void Main(string[] args){“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    int[] ary = new int[]{ 2, 3, 3, 5, 4, 7, 4 }; “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    int[] res = CountingSort(ary, 7); “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    foreach(int vr in res)“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    {“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
        Console.Write(vr.ToString() + " ");“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    } “øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
    Console.ReadLine();“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
}“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
“øKwÃ«¶www.netcsharp.cn˜¢фóãQÙ
1
查看完整版本: C#实现计数排序(CountingSort)算法