以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  快速排序算法的C#实现  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11738)


--  作者:admin
--  发布时间:11/9/2004 2:25:00 AM

--  快速排序算法的C#实现


发信人: Jobs (温少), 信区: DotNET        
标  题: 快速排序算法的C#实现
发信站: BBS 水木清华站 (Sun Jan  5 02:48:33 2003)

/**
*  
*  

    @author     <a href="wen">mailto:szuJobs@hotmail.com">wenshaojin</a>
    @created    January 5, 2003
    @version    1

*
**/
using System;
using System.Collections;

namespace Matrix.Common.Utils
{
    /// <summary>
    /// Summary description for SortUtils.
    /// </summary>
    public class SortUtils
    {
        #region 用于IList的快速排序
        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(IList list)
        {
            QuickSort(list, 0, list.Count-1, new CompareMethod(Comparer.Defaul
t.Compare));
        }

        public static void QuickSort(IList list, CompareMethod compare)
        {
            QuickSort(list, 0, list.Count-1, compare);
        }

        private static void QuickSort(IList list, int low, int high, CompareMe
thod compare)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            object pivot = list[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                 
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(compare(list[i], pivot)<0);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(compare(list[j], pivot)>0);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                //Swap
                object temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }

            //设置pivot
            list[low] = list[j];
            list[j] = pivot;

            QuickSort(list, low, j-1, compare); //对左段排序
            QuickSort(list, j+1, high, compare); //对右段排序
        }

        #endregion

        //用于值类型的快速排序,有更好的性能
        #region 用于值类型数组的快速排序
        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(int[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(long[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(float[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(double[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(decimal[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="array"></param>
        public static void QuickSort(DateTime[] array)
        {
            QuickSort(array, 0, array.Length-1);
        }


        private static void QuickSort(int[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            int pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }

        private static void QuickSort(long[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            long pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }

        private static void QuickSort(float[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            float pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }

        private static void QuickSort(double[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            double pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }

        private static void QuickSort(decimal[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            decimal pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }

        private static void QuickSort(DateTime[] array, int low, int high)
        {
            if(low >= high)
            {
                return;
            }

            int i = low; //从左到右的游标
            int j = high + 1; //从右到左的游标

            DateTime pivot = array[low];

            //把左侧>=pivot的元素与右侧<=pivot的元素进行交换
            while(true)
            {
                do //从左侧寻找>=pivot的元素
                {
                    i++;
                }
                while(array[i] < pivot);

                do //从右侧寻找<=pivot的元素
                {
                    j--;
                }
                while(array[j] > pivot);

                if(i >= j) //未发现交换对象
                {
                    break;
                }

                Swap(ref array[i], ref array[j]);
            }

            //设置pivot
            array[low] = array[j];
            array[j] = pivot;

            QuickSort(array, low, j-1); //对左段排序
            QuickSort(array, j+1, high); //对右段排序
        }


        private static void Swap(ref int a, ref int b)
        {
            int temp = a;
            a = b;
            b = temp;
        }
        private static void Swap(ref long a, ref long b)
        {
            long temp = a;
            a = b;
            b = temp;
        }
        private static void Swap(ref float a, ref float b)
        {
            float temp = a;
            a = b;
            b = temp;
        }
        private static void Swap(ref double a, ref double b)
        {
            double temp = a;
            a = b;
            b = temp;
        }
        private static void Swap(ref decimal a, ref decimal b)
        {
            decimal temp = a;
            a = b;
            b = temp;
        }
        private static void Swap(ref DateTime a, ref DateTime b)
        {
            DateTime temp = a;
            a = b;
            b = temp;
        }
        #endregion

        /// <summary>
        /// 如果a小于b,返回小于0的数字。
        /// 如果a等于b,返回等于0的数字。
        /// 如果a大于b,返回大于0的数字。
        /// </summary>
        public delegate int CompareMethod(object a, object b);
    }
}


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 218.17.71.167]
上一篇
返回上一页
回到目录
回到页首
下一篇



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms