zoukankan      html  css  js  c++  java
  • 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;

        }

    }

    最近看<<算法导论>>, 虽然是英文版的, 但也比我买的一本<<算法基础>>好懂, 那本<<算法基础>>翻译的实在是让人感觉不知所云.
  • 相关阅读:
    兼容 IE6,IE7,IE8,IE9,FF,
    估算百度一个关键字的标准
    session_start() [function.sessionstart]
    PHP小实例制作留言本 .
    ADO.NET2.0的十大新特性
    使用NavigationController, 或ModalViewController实现旋转新视图横屏,再旋转返回
    [转一篇]Mac开发/iPhone开发 发送HttpRequest请求
    Topic : How to use TabBar in viewbase application
    Howto: Drawing Pie Charts using iPhone SDK
    MPMovieViewController does not show audio control (I can listen it too!)
  • 原文地址:https://www.cnblogs.com/Dah/p/552185.html
Copyright © 2011-2022 走看看