欢迎访问宙启技术站
智能推送

快速排序函数的算法解析和实现

发布时间:2023-06-23 01:58:39

快速排序(Quicksort)是一种常见的排序算法,其基本思想是将待排序的数组划分为左右两个子数组,其中左子数组的所有元素均小于右子数组的所有元素,然后递归地对左右子数组进行排序。它是一种比较高效的排序算法,其时间复杂度为O(nlogn),但最坏情况下的时间复杂度为O(n^2)。

快速排序的算法流程如下:

1. 选择基准点pivot,将数组划分为左右两个子数组(左子数组的元素均小于等于pivot,右子数组的元素均大于等于pivot);

2. 对左右子数组分别递归地进行快速排序;

3. 合并左右子数组。

其中,基准点的选择方式有很多种,比如选择 个元素作为基准点、选择中间元素、选择随机元素等等。在这里我们选择 个元素作为基准点。

快速排序的实现代码如下:

void quicksort(int arr[], int left, int right) {
    if (left >= right) return;  // 当左右指针相遇时,返回
    int pivot = arr[left];      // 选择      个元素作为基准点
    int i = left, j = right;    // 初始化左右指针
    while (i < j) {
        while (i < j && arr[j] >= pivot) j--;   // 从右往左扫描,找到      个小于pivot的元素
        if (i < j) arr[i++] = arr[j];           // 将此元素放到左边(即i所指位置)
        while (i < j && arr[i] < pivot) i++;    // 从左往右扫描,找到      个大于等于pivot的元素
        if (i < j) arr[j--] = arr[i];           // 将此元素放到右边(即j所指位置)
    }
    arr[i] = pivot;             // 将基准点放到i所指位置
    quicksort(arr, left, i-1);  // 递归地对左右子数组进行快速排序
    quicksort(arr, i+1, right);
}

在上述代码中,我们使用指针i和j来指向数组的左右两端。当i和j未相遇时,从右往左扫描数组,找到 个小于基准点的元素,将其放到数组的左边;然后从左往右扫描数组,找到 个大于等于基准点的元素,将其放到数组的右边。当i和j相遇时,将基准点放到i所指位置,并对左右子数组分别递归地进行快速排序。

快速排序的时间复杂度为O(nlogn),但最坏情况下的时间复杂度为O(n^2),即当数组已经有序或接近有序时。此外,快速排序是一种原地排序算法,不需要额外的空间复杂度。但由于其采用的是递归调用方式,因此会使用栈空间。