快速排序
数据结构 | 数组 |
---|---|
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O(n log n) |
空间复杂度 | O(log n) |
排序方式 | in-place |
稳定性 | 不稳定 |
比较次数 | nlog(n),最差为n(n-1)/2 |
步骤:
-
先从数列中取出一个数,称为 “基准”(pivot);
-
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
代码:
/// <summary> /// 快速排序 /// </summary> public class QKSort : SortBase, ISort { public void Sort() { Sort(arr, 0, arr.Length - 1); base.output(arr); } public void Sort(int[] a, int left, int right) { int i, j, pivot; if (left < right) { pivot = a[left]; //pivot中存的就是基准数 i = left; j = right; while (i != j) { while (i < j && a[j] >= pivot)//顺序很重要,要先从右边开始找 j--; while (i < j && a[i] <= pivot)//再找左边的 i++; if (i < j) { //交换两个数在数组中的位置 base.swap(a, i, j); } } //最终将基准数归位 a[left] = a[i]; a[i] = pivot; Sort(a, left, i - 1); //继续处理左边的,这里是一个递归的过程 Sort(a, i + 1, right);//继续处理右边的,这里是一个递归的过程 } } public void Sort2() { Sort2(arr2, 0, arr2.Length - 1); base.output(arr2); } public void Sort2(int[] b, int left, int right) { if (left < right) { int i = left; int j = right; int pivot = b[left];//pivot中存的就是基准数 while (i < j) { while (i < j && b[j] >= pivot) // 从右向左找 j--; if (i < j) b[i++] = b[j]; while (i < j && b[i] < pivot) // 从左向右找 i++; if (i < j) b[j--] = b[i]; } b[i] = pivot; Sort2(b, left, i - 1); // 递归调用 Sort2(b, i + 1, right); } } }
参考:https://blog.csdn.net/adusts/article/details/80882649
https://blog.csdn.net/MoreWindows/article/details/6684558