• C#排序算法6:快速排序


    快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    原理:

          1.从数列中挑出一个元素,称为 “基准”(pivot);

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

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

            static int[] QuickSort(int[] arr, int low, int high)
            {
                if (low < high)
                {
    
                    int key = arr[low];//1.这里选arr[low]为基准数
                    var left = low;
                    var right = high;
                    while (left < right) //2. 分区操作,比基准数小的放左边,大的放右边
                    {
                        //从序列右往左比较,比基准数小的拿出来,放到基准数的左边
                        while (left < right)
                        {
                            if (arr[right] < key)
                            {
                                arr[left] = arr[right];
                                break;
                            }
                            else
                            {
                                right--;//左移下一个数字进行比较
                            }
                        }
    
                        //从序列左往右比较,比基准数大的拿出来,放到基准数的右边
                        while (left < right)
                        {
                            if (arr[left] > key)
                            {
                                arr[right] = arr[left];
                                break;
                            }
                            else
                            {
                                left++;//右移下一个数字进行比较
                            }
    
                        }
    
    
                    }
                    //2. 分区退出之后,基准数恰好位于中间位置
                    //跳出循环,现在left==right  left是中间位置
                    arr[left] = key;
                    //3.再次递归
                    QuickSort(arr, low, left - 1);//左边再次排序
                    QuickSort(arr, left + 1, high);//右边再次排序
    
    
                }
                return arr;
    
            }

    排序结果

            static void Main(string[] args)
            {
                Console.WriteLine($"数据算法");
                var arr1 = GetArrayData(8, 1, 22);
                Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}");
                //var arr2 = BubbleSort(arr1);
                //Console.WriteLine($"冒泡排序:{ShowArray(arr2)}");
                //var arr3 = SelectSort(arr1);
                //Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}");
                //var val = arr3[3];
                //var arr4=   InsertSort(arr1);
                //Console.WriteLine($"插入排序arr4:{ShowArray(arr4)}");
               var arr5= QuickSort(arr1, 0, arr1.Length - 1);
                Console.WriteLine($"快速排序arr5:{ShowArray(arr5)}");
    
                //var index=  BinarySearch(arr3, 0, arr1.Length - 1,val);
                //Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}");
                //var val2 = arr3[4];
                //var index2 = BinarySearch2(arr3, val2);
                //Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}");
                Console.ReadLine();
            }

  • 相关阅读:
    79. 滑动窗口的最大值
    78. 左旋转字符串
    77. 翻转单词顺序
    76. 和为S的连续正数序列
    75. 和为S的两个数字
    innodb 锁机制
    MVCC
    linux查看状态命令
    design pattern 资料整理
    mysql资料汇总
  • 原文地址:https://www.cnblogs.com/for-easy-fast/p/14033764.html
Copyright © 2020-2023  润新知