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();
        }

原文地址:https://www.cnblogs.com/for-easy-fast/p/14033764.html