zoukankan      html  css  js  c++  java
  • 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.总结思想

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

    然后再进行左右两边递归

  • 相关阅读:
    【LeetCode】204
    【LeetCode】231
    【LeetCode】58
    解决error104 socket error问题
    爬虫问题
    80端口被system占用的问题
    Linux命令行下批量重命名文件名为数字索引编号(0~N.xxx)的方法
    [转]利用excel进行线性规划求解
    python——时间与时间戳之间的转换
    最全中文停用词表整理(1893个)
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13305703.html
Copyright © 2011-2022 走看看