zoukankan      html  css  js  c++  java
  • 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();
            }

  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/for-easy-fast/p/14033764.html
Copyright © 2011-2022 走看看