博客园不常在线

有问题联系微信

微信号

微信公众号

C#数据结构与算法系列(二十二):快速排序算法(QuickSort)

1.介绍

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,

其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,

整个排序过程可以递归进行,以此达到整个数据变成有序序列

2. 示意图

 

 

  3. 示例

要求: 对 [-9,78,0,23,-567,70] 进行从小到大排序

 

    public class QuickSort
    {
        public static void Test()
        {
            int[] arr = { -9, 78, 0, 23, -567, 70 };

            Sort(arr,0,arr.Length-1);

            System.Console.WriteLine(string.Join(",",arr));
        }

        public static void  Sort(int[] arr ,int left,int right)
        {
            int l = left;

            int r = right;

            //中间值
            int middle = arr[(l + r) / 2];

            //temp临时变量
            int temp = 0;

            //while循环的目的是让比middle值小的放在左边 比middle大的值放在右边
            while (l<r)
            {
                //在middle的左边一直找,找到大于等于middle的值才退出
                while (arr[l]<middle)
                {
                    l++;
                }
                //在middle的右边边一直找,找到小于等于middle的值才退出
                while (arr[r]>middle)
                {
                    r -= 1;
                }

                //如果l>=说明middle的左边两边的值,已按照左边全是小于等于middle的值,右边都是大于middle的值
                if (l>=r)
                {
                    break;
                }

                //交换

                temp = arr[l];

                arr[l] = arr[r];

                arr[r] = temp;

                //如果交换完之后,发现这个arr[l]==middle这个值 ,-- 前移
                if (arr[l]==middle)
                {
                    r -= 1;
                }

                //如果交换完之后,发现这个arr[r]==middle这个值 ,++ 后移
                if (arr[r]==middle)
                {
                    l++;
                }

            }

            //如果l==r,必须l++,r--,否则会出现栈溢出
            if (l==r)
            {
                l += 1;

                r -= 1;
            }

            //向左递归
            if (left<r)
            {
                Sort(arr, left, r);
            }

            //向右递归
            if (right>l)
            {
                Sort(arr, l, right);
            }

        }
    }

 

 

 

效果图

 4.总结思想

简而言之就是首先获取数组的中间值 然后将中间值于两边的数据比较 如左边的大于中间值或者右边的小于中间值 那么就替换 

然后再进行左右两边递归

 

posted @ 2020-07-16 16:35  Code技术分享  阅读(324)  评论(0编辑  收藏  举报