快速排序算法 ——quick_sort

快速排序是一种常用的排序算法,其基本思想是通过一趟排序将数组分成两个部分,其中一部分的元素都比另一部分小,然后再分别对这两部分进行排序,直到整个数组有序。

具体步骤如下:

1. 选取一个元素作为基准值(pivot)。
2. 通过一趟排序,将数组中的元素重新排列,使得比基准值小的元素都在基准值的左边,比基准值大的元素都在基准值的右边。
  - 使用两个指针i和j,分别指向数组的第一个元素和最后一个元素。
  - 从右往左寻找第一个小于基准值的元素,将其与i指针所指的元素交换位置。
  - 从左往右寻找第一个大于基准值的元素,将其与j指针所指的元素交换位置。
  - 循环执行以上两步,直到i和j相遇。
  - 最后将基准值与i指针所指的元素交换位置。
3. 对基准值左边的子数组和右边的子数组分别进行递归排序。

快速排序的优点是原地排序,不需要额外的存储空间;缺点是对于有序的数组排序效率较低,时间复杂度为O(n^2)。但是平均情况下,快速排序的时间复杂度为O(nlogn),性能较好。

模板代码:

#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int>& nums, int left, int right) {
    int pivot = nums[right];
    int i = left - 1;
    
    for (int j = left; j < right; j++) {
        if (nums[j] <= pivot) {
            i++;
            swap(nums[i], nums[j]);
        }
    }
    
    swap(nums[i+1], nums[right]);
    return i+1;
}

void quicksort(vector<int>& nums, int left, int right) {
    if (left < right) {
        int pivot = partition(nums, left, right);
        
        quicksort(nums, left, pivot - 1);
        quicksort(nums, pivot + 1, right);
    }
}

void printArray(vector<int>& nums) {
    for (int i = 0; i < nums.size(); i++) {
        cout << nums[i] << " ";
    }
    cout << endl;
}

int main() {
    vector<int> nums = {9, 2, 5, 1, 6, 8, 4, 3, 7};
    int n = nums.size();
    
    cout << "Original array: ";
    printArray(nums);
    
    quicksort(nums, 0, n-1);
    
    cout << "Sorted array: ";
    printArray(nums);
    
    return 0;
}

这段代码使用了分治法的思想来进行快速排序。首先选择一个基准元素,将数组中比基准元素小的放在它的左边,比它大的放在右边,然后对左右两个子数组进行递归排序,直到子数组的大小为1或0。

在 partition 函数中,我们选择数组最后一个元素作为基准元素,并使用双指针法进行元素的交换,使得最终基准元素的位置正确。

在 quicksort 函数中,我们首先检查数组的大小,只有当数组的大小大于1时才需要进行排序。然后选择基准元素并调用 partition 函数,将数组分为两部分进行递归排序。

最后,在 main 函数中,我们创建一个测试数组并调用 quicksort 函数进行排序,然后打印排序后的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值