快速排序由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(); }