快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
原理:
1.从数列中挑出一个元素,称为 “基准”(pivot);
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
代码语言:javascript复制 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;
}
排序结果
代码语言:javascript复制 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();
}