快速排序

  • 思想
          分治 ( 递归 ) 
          设立 "基准"  pivot(一般为待排序列的第一个元素),根据 "基准" 拆出两个集合,左侧小,右侧大,每个集合再设立 “基准” 继续拆分,直到全部拆完顺序为止
         
  • 算法图解
          待排数组:array[]{4, 2, 9, 11, 7, 8, 6, 5, 3, 10 }

    

  • 应用场景
  1  快速排序就是一个“快”字,排序算法中平均排序速度很好的排序算法,在空间允许的情况下可以使用
  2  大文件处理时,结合堆排序或者归并,分解小文件并在内存中进行快排

  • 算法优化(以不大幅度增加代码复杂度为原则)
  1   多线程快速排序:在多核 CPU 的今天,可以利用多核计算快速排序,拆分的每个集合都可以使用一个线程处理并返回一个值
  2   减少交换次数

  • 时间复杂度(不稳定)
          最差       O(n^2)
          最优       O(nlog 2 n)
          平均       O(nlog 2 n)
  • 空间复杂度
    根据实现的方式不同而不同     O(log 2 n)~O(n)

  • 程序实现 (本例使用了C#)

         #region 方式一
        public  static  int SortUnit( int[] array,  int low,  int high)
        {
            int key = array[low];
            Console.WriteLine( "key : " + key);
            Console.WriteLine( "");
            while (low < high)
            {
                while (array[high] >= key && high > low)
                {
                    --high;
                }
                array[low] = array[high];
                while (array[low] <= key && low < high)
                {
                    ++low;
                }
                array[high] = array[low];
            }
            array[low] = key;

            Console.WriteLine( string.Join( ",", array));
            //Console.WriteLine("");

            return high;
        }

        public  static  void Sort( int[] array,  int low,  int high)
        {
            if (low >= high)
                return;
            /*完成一次单元排序*/
            int index = SortUnit(array, low, high);
            /*对左边单元进行排序*/
            Sort(array, low, index - 1);
            //Console.WriteLine("左侧排完:" + string.Join(",", array));
            /*对右边单元进行排序*/
            Sort(array, index + 1, high);
            //Console.WriteLine("右侧排完:" + string.Join(",", array));
        }
        #endregion









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值