• Selection in expected linear time


    下面的是我用C#写的一个算法, 功能是从一个数组中选择第 i 小的一个数, 平均时间复杂度是Θ(n).

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Diagnostics;

     

    class Program

    {

        static void Main(string[] args)

        {

            int[] array = new int[] { 9, 3, 4, 7, 10, 5, 1 };

            int ismall = RandomizedSelect(array, 3);

            Debug.Assert(ismall == 4);

        }

     

        /// <summary>

        /// select the value of the i-th smallest number of the array

        /// </summary>

        static int RandomizedSelect(int[] array, int i)

        {

            return RandomizedSelect(array, 0, array.Length - 1, i);

        }

     

        /// <summary>

        /// select the value of the i-th smallest number between array[startIndex] and array[endIndex]

        /// </summary>

        static int RandomizedSelect(int[] array, int startIndex, int endIndex, int i)

        {

            if (startIndex == endIndex)

                return array[startIndex];

            int q = Partition(array, startIndex, endIndex);

            int k = q - startIndex + 1;

            if (k == i)

                return array[q];

            else if (k < i)

                return RandomizedSelect(array, q + 1, endIndex, i - k);

            else

                return RandomizedSelect(array, startIndex, q - 1, i);

        }

     

        /// <summary>

        /// partition the array(smaller left, bigger right), return the pivot index

        /// </summary>

        static int Partition(int[] array, int startIndex, int endIndex)

        {

            //just using the middle number, thought it may not be the best way

            int mid = (endIndex + startIndex) / 2;

            int v = array[mid];

            Swap(array, mid, endIndex);

            int i = startIndex - 1;

            int j = endIndex;

            while (true)

            {

                while (array[++i] < v) { }

                while (array[--j] > v) { }

                if (i > j)

                    break;

                Swap(array, i, j);

            }

            Swap(array, i, endIndex);

            return i;

        }

     

        /// <summary>

        /// swap two numbers in the array

        /// </summary>

        static void Swap(int[] array, int index1, int index2)

        {

            int temp = array[index1];

            array[index1] = array[index2];

            array[index2] = temp;

        }

    }

    最近看<<算法导论>>, 虽然是英文版的, 但也比我买的一本<<算法基础>>好懂, 那本<<算法基础>>翻译的实在是让人感觉不知所云.
  • 相关阅读:
    PHP防盗链的基本思想&&防盗链的设置方法
    PHP程序员遇到职业问题时,是离职?还是坚持?
    如何学习Linux性能优化?
    PHP到底有多牛?你所知道的网站都在用它
    Linux 与 Unix 到底有什么不同?区别在哪?
    用PHP打造一个高性能好用的网站
    七夕-心形表白-简单css代码
    css雪碧图-css精灵图
    jquery-时间轴滑动
    js-进度条-动画
  • 原文地址:https://www.cnblogs.com/Dah/p/552185.html
Copyright © 2020-2023  润新知