算法和数据结构 快速排序
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、快速排序不稳定,因为相等的数,排序前后的相对位置可能会变,具体看实现中的判断条件。