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;

        }

    }

    最近看<<算法导论>>, 虽然是英文版的, 但也比我买的一本<<算法基础>>好懂, 那本<<算法基础>>翻译的实在是让人感觉不知所云.
  • 相关阅读:
    利用canvas的getImageData()方法制作《在线取色器》
    JS的click触发匿名函数 怎么解绑
    apache配置VirtualHost(windows)
    Docker容器化【Dockerfile编写&&搭建与使用Docker私有仓库】
    17.持续集成与容器管理
    第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十二天】(系统架构讲解、nginx)
    springMVC常用知识点的整理
    第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十一天】(购物车+订单)
    第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登录系统实现)
    第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)
  • 原文地址:https://www.cnblogs.com/Dah/p/552185.html
Copyright © 2011-2022 走看看