c# 实现快速排序算法

    /// <summary>
    /// 快速排序
    /// </summary>
    public class QuickSort
    {
        /// <summary>
        /// 快速排序入口
        /// </summary>
        /// <param name="array">待排序的数据数组</param>
        public static void quick_sort(int[] array)
        {
            if (null == array || 0 == array.Count())
                return; //判断数据的合法性
            Console.WriteLine("原始数据为");
            foreach (int i in array)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine(" ");
            _quick_sort(array, 0, array.Count() - 1);
            Console.WriteLine("排序后的数据为");
            foreach (int i in array)
            {
                Console.Write(i + " ");
            }
        }
        /// <summary>
        /// 快速排序核心算法
        /// </summary>
        /// <param name="array">待排序的数据数组</param>
        /// <param name="low">待排序的数据数组起始位置</param>
        /// <param name="high">待排序的数据数组结束位置</param>
        static void _quick_sort(int[] array, int low, int high)
        {
            int pivotpos; //划分后的基准记录的位置
            if (low < high)
            {
                //仅当区间长度大于1时才须排序
                pivotpos = Partition(array, low, high); //对R[low..high]做划分
                _quick_sort(array, low, pivotpos - 1); //对左区间递归排序
                _quick_sort(array, pivotpos + 1, high); //对右区间递归排序
            }
        }
        /// <summary>
        /// 对array[low..high]做划分,并返回基准记录的位置
        /// </summary>
        /// <param name="array"></param>
        /// <param name="i"></param>
        /// <param name="j"></param>
        /// <returns></returns>
        static int Partition(int[] array, int i, int j)
        {
            int pivot = array[i]; //用区间的第1个记录作为基准
            while (i < j)
            {
                //从区间两端交替向中间扫描,直至i=j为止
                while (i < j && array[j] >= pivot) //pivot相当于在位置i上
                    j--; //从右向左扫描,查找第1个关键字小于基准值(pivot)的记录array[j]
                if (i < j) //表示找到的R[j]的关键字<pivot.key
                array[i++] = array[j]; //相当于交换R[i]和R[j],交换后i指针加1

                Console.WriteLine(" ");
                foreach (int var in array)
                {
                    Console.Write(var + " ");
                }
                while (i < j && array[i] <= pivot) //pivot相当于在位置j上
                    i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
                if (i < j) //表示找到了R[i],使R[i].key>pivot.key
                    array[j--] = array[i]; //相当于交换R[i]和R[j],交换后j指针减1
                
                Console.WriteLine(" ");
                foreach (int var in array)
                {
                    Console.Write(var + " ");
                }
            }
            array[i] = pivot; //基准记录已被最后定位
            return i;
        }
    }

调用示例

 int[] array = { 49, 38, 65, 97, 76, 13, 27, 49 };
            QuickSort.quick_sort(array);
            Console.ReadKey();

 

 

posted @ 2013-01-31 15:28  .NET Fans  阅读(248)  评论(0编辑  收藏  举报