快速排序

 

数据结构 数组
最差时间复杂度 O(n^2)
最优时间复杂度 O(n log n)
空间复杂度 O(log n)
排序方式 in-place
稳定性 不稳定
比较次数  nlog(n),最差为n(n-1)/2

 

 

 

 

 

 

 

 

 

 

 步骤: 

  • 先从数列中取出一个数,称为 “基准”(pivot);

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

代码:

    /// <summary>
    /// 快速排序
    /// </summary>
    public class QKSort : SortBase, ISort
    {
        public void Sort()
        {
            Sort(arr, 0, arr.Length - 1);
            base.output(arr);
        }

        public void Sort(int[] a, int left, int right)
        {
            int i, j, pivot;
            if (left < right)
            {
                pivot = a[left]; //pivot中存的就是基准数
                i = left;
                j = right;
                while (i != j)
                {
                    while (i < j && a[j] >= pivot)//顺序很重要,要先从右边开始找
                        j--;
                    while (i < j && a[i] <= pivot)//再找左边的
                        i++;
                    if (i < j)
                    {
                        //交换两个数在数组中的位置
                        base.swap(a, i, j);
                    }
                }
                //最终将基准数归位
                a[left] = a[i];
                a[i] = pivot;
                Sort(a, left, i - 1); //继续处理左边的,这里是一个递归的过程
                Sort(a, i + 1, right);//继续处理右边的,这里是一个递归的过程
            }
        }


        public void Sort2()
        {
            Sort2(arr2, 0, arr2.Length - 1);
            base.output(arr2);
        }

        public void Sort2(int[] b, int left, int right)
        {
            if (left < right)
            {
                int i = left;
                int j = right;
                int pivot = b[left];//pivot中存的就是基准数
                while (i < j)
                {
                    while (i < j && b[j] >= pivot) // 从右向左找
                        j--;
                    if (i < j)
                        b[i++] = b[j];

                    while (i < j && b[i] < pivot) // 从左向右找
                        i++;
                    if (i < j)
                        b[j--] = b[i];
                }
                b[i] = pivot;
                Sort2(b, left, i - 1); // 递归调用 
                Sort2(b, i + 1, right);
            }
        }


    }

 

 

 

 

参考:https://blog.csdn.net/adusts/article/details/80882649

           https://blog.csdn.net/MoreWindows/article/details/6684558

 

posted @ 2019-01-30 17:01  luanxm  阅读(145)  评论(1编辑  收藏  举报