算法和数据结构 快速排序

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

 

posted @ 2020-03-18 19:53  happyyoung  阅读(153)  评论(0编辑  收藏  举报