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

    http://www.cnblogs.com/clingingboy/archive/2010/07/02/1770057.html

    一.计数排序

    思想:前提待排序元素是位于0到k之间的正整数

    用一个额外的数组(数组大小为k+1)记录计数数组元素

    如果元素x的位置为m,那么比元素x小的个数为m-1,按照以上思想先算出元素的计数索引,然后根据索引值从原待排序的数组中取元素,每次取元素,则计数减1

    http://www.cnblogs.com/sun/archive/2008/06/24/1228581.html

    算法参考如上地址

    /// <summary>
    /// counting sort
    /// </summary>
    /// <param name="arrayA">input array</param>
    /// <param name="arrange">the value arrange in input array</param>
    /// <returns></returns>
    public static int[] CountingSort(int[] arrayA, int arrange)
    {
        //array to store the sorted result, 
        //size is the same with input array.
        int[] arrayResult = new int[arrayA.Length];
    
        //array to store the direct value in sorting process
        //include index 0;
        //size is arrange+1;
        int[] arrayTemp = new int[arrange + 1];
    
        //clear up the temp array
        for (int i = 0; i <= arrange; i++)
        {
            arrayTemp[i] = 0;
        }
    
        //now temp array stores the count of value equal
        for (int j = 0; j < arrayA.Length; j++)
        {
            arrayTemp[arrayA[j]] += 1;
        }
    
        //now temp array stores the count of value lower and equal
        for (int k = 1; k <= arrange; k++)
        {
            arrayTemp[k] += arrayTemp[k - 1];
        }
    
        //output the value to result
        for (int m = arrayA.Length - 1; m >= 0; m--)
        {
            arrayResult[arrayTemp[arrayA[m]] - 1] = arrayA[m];
            arrayTemp[arrayA[m]] -= 1;
        }
    
        return arrayResult;
    }

    二.桶排序

    参考http://www.cnblogs.com/sun/archive/2008/07/07/1237331.html

    思路:前提待排序数组A[1...n]内的元素是随机分布在[0,1)区间内的的浮点数

    将原数组元素进行分类(分成n个链表(即桶的概念))

    然后将元素按取值不同分配到不同桶中

    对每个桶的数据进行排序

    然后对每个桶的数据重新按顺序收集合并即可

    算法参考如下http://blog.csdn.net/pojianbing/archive/2010/07/07/5718285.aspx

    /// <summary>
    /// 桶排序
    /// </summary>
    /// <param name="arrayToSort">待排序的数组(该数组的元素在[0-1) )</param>
    /// <returns>排序后的结果</returns>
    public static double[] BucketSort(double[] arrayToSort)
    {
        // 桶
        LinkedList<double>[] bucket = new LinkedList<double>[10];
        // 初始化桶
        for (int i = 0; i < 10; i++)
        {
            bucket[i] = new LinkedList<double>();
        }
    
        // 元素分装到各桶
        for (int i = 0; i < arrayToSort.Length; i++)
        {
            int bucketIndex = (int)(arrayToSort[i] * 10d);
    
            // 添加并进行插入排序
            InsertToLinkList(bucket[bucketIndex], arrayToSort[i]);
        }
    
        // 各桶排序
        int index = 0;
        for (int i = 0; i < 10; i++)
        {
            foreach (var item in bucket[i])
            {
                arrayToSort[index++] = item;
            }
        }
    
        return arrayToSort;
    }
    
    /// <summary>
    ///  按升序插入
    /// </summary>
    /// <param name="linkedList">要排序的链表</param>
    /// <param name="num">要插入排序的数字</param>
    private static void InsertToLinkList(LinkedList<double> linkedList, double num)
    {
        if (linkedList.Count == 0)
        {
            linkedList.AddFirst(num);
            return;
        }
    
        for (int i = linkedList.Count - 1; i >= 0; i--)
        {
            if (linkedList.ElementAt(i) <= num)
            {
                LinkedListNode<double> node = linkedList.FindLast(linkedList.ElementAt(i));
                linkedList.AddAfter(node, num);
            }
        }
    }
  • 相关阅读:
    Hello,Power BI
    ubuntu 14.04中Elasticsearch 2.3 中 Nginx 权限认证
    Elasticsearch中doc_value的认识
    Elasticsearch 5.0 _source field的简单认识
    在kubernetes集群上用helm安装Datadog(Monitoring)
    在Windows上安装Elasticsearch 5.0
    Matlab 高斯_拉普拉斯滤波器处理医学图像
    Logstash时区、时间转换,message重组
    Elasticsearch 2.3 (ELK)Geo_point绘图、日志Date时间获取实例
    ubuntu 安装Elasticsearch5.0(Debian包)
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1956471.html
Copyright © 2011-2022 走看看