下面的是我用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;

    }

}

最近看<<算法导论>>, 虽然是英文版的, 但也比我买的一本<<算法基础>>好懂, 那本<<算法基础>>翻译的实在是让人感觉不知所云.
Posted on 2006-11-06 19:29 Adrian H. 阅读(130) 评论(0)  编辑 收藏 网摘 所属分类: Algorithm




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-06 19:31 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: