算法和数据结构 快速排序
1、时间复杂度:O(NlogN)。
2、算法思想:分治。
3、算法实现
1)从数组中取一个数作为基准数pivot,基准数所在的位置hole;
2)把不大于pivot的数放到左边,大于的放到右边,这样就形成左右两个子数组;
2.1)从右向左找一个不大于pivot的数,放到位置hole上,更新hole为找到的数的位置。
2.2)从左向右找一个大于pivot的数,放到位置hole上,更新hole为找到的数的位置。
2.3)不断重复步骤2.1)和2.2),直到找不到。
3)对左右子数组,分别重复步骤1)和2),直到各个子数组都不多于一个元素。
void quick_sort(std::vector<int> &arr, int l, int r)
{
// 子数组不多于1个元素,即有序
if (l >= r) return;
// 取子数组第一个数为基准数,产生一个坑
int pivot = arr[l], hole = l;
int i = l, j = r;
while (i < j) {
// 从右向左找一个不大于基准数的数,条件i < j用于防止越界
while (i < j && arr[j] > pivot) j--;
// 把找到的数放到坑里,并更新坑
arr[hole] = arr[j];
hole = j;
// 从左向右找一个大于基准数的数
while (i < j && arr[i] <= pivot) i++;
arr[hole] = arr[i];
hole = i;
}
arr[hole] = pivot;
quick_sort(arr, l, hole-1);
quick_sort(arr, hole+1, r);
}
4、快速排序不稳定,因为相等的数,排序前后的相对位置可能会变,具体看实现中的判断条件。

浙公网安备 33010602011771号