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;

        }

    }

    最近看<<算法导论>>, 虽然是英文版的, 但也比我买的一本<<算法基础>>好懂, 那本<<算法基础>>翻译的实在是让人感觉不知所云.
  • 相关阅读:
    实战DeviceIoControl 之五:列举已安装的存储设备
    在NT中直接访问物理内存
    实战DeviceIoControl 之三:制作磁盘镜像文件
    实战DeviceIoControl 之六:访问物理端口
    程序员的十层楼(转)
    Vista + VS2005 源代码绑定的问题
    敬告天下IT业主
    手动卸载windows服务
    古墓丽影9的截屏
    白领饮食十大“夺命”恶习(转)
  • 原文地址:https://www.cnblogs.com/Dah/p/552185.html
Copyright © 2011-2022 走看看