快速排序算法详解

快速排序

算法描述:

快速排序(Quick Sort)是一种常见的基于分治思想的高效排序算法,其核心思想是通过不断将待排序数据分割成独立的两部分,使得每个子序列都是有序的。具体来说,其排序过程如下:

  1. 选取一个基准值(pivot),一般是待排序区间的第一个元素。
  2. 通过一趟排序将待排序记录分成左右两个部分,其中左边部分的元素都小于等于基准值右边部分的元素都大于基准值,且基准值在最终排好序的序列中已经就位。
  3. 对左右两个部分分别重复步骤 1 和步骤 2,直到整个序列有序。

算法演示

​ 现在假设我们对[2, 5, 3, 7, 1, 8, 4, 10, 6, 9]这组数进行快速排序,选取第一个数2作为基准数。在这个序列中,将所有比基准数大的数放在2的右边,比基准数小的数放在2的左边.
​ 在初始状态下,数字2在序列的第1位。我们的目标是将2挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于2,右边的数都大于等于2。

第一步我们设定两个指针i和j分别指向数组的最左端和最右端.

在这里插入图片描述

第二步,先让j向左移动,找到第一个比基准值2小的数指向它,然后将i向右移动,找到比基准值2大的第一个数指向它。
在这里插入图片描述

找到i指向5,j指向1,然后交换它俩的位置
在这里插入图片描述

然后就可以得到[2,1,3,7,5,8,4,10,6,9]这一串数组,然后继续先向左移动j,找到比基准值小的第一个数指向1,这时发现i和j相遇了,本轮循环结束,让3与基准值2交换位置,i和j重新指向最左端和最右端。

在这里插入图片描述

在这里插入图片描述

到此,第一轮循环结束,得到的数组顺序为[1,2,3,7,5,8,4,10,6,9],可以发现第一轮基准值2的左边全是比它小的数,基准值的右边是比它大的数,由此可以分为左右两个数组,左边是[1],右边是[3,7,5,8,4,10,6,9]模拟第一轮循环,直到不可拆分出新的子序列为止。最终将会得到这样的序列,如下

左:[1],又右[3,7,5,8,4,10,6,9]

右边序列是以3为基准值排列得到的,然后继续以3为基准值,将数组分为左右两部分,再模拟上边循环可得到:

左边[1,2],右边[75,8,4,10,6,9]

继续模拟上边循环,右边以7为基准值,可得到:

左边[1,2,3,4,5,6],右边[10,8,9]

最后再以10为基准值,就可将整个数组排序完成

在这里插入图片描述

代码演示

以C++代码演示快速排序


 #include <iostream>
 #include <algorithm> 
 using namespace std;
   
   void quickSort(int nums[], int start, int end) {
       if (start >= end) return;
       int i = start, j = end, base = nums[start];
       while (i < j) {
           while (i < j && nums[j] >= base) j--;
           while (i < j && nums[i] <= base) i++;
           if (i < j) swap(nums[i], nums[j]);
       }
       swap(nums[start], nums[i]);
       quickSort(nums, start, j - 1);
       quickSort(nums, j + 1, end); 
       }
   
   int main() {
       int nums[] = {11, 24, 5, 32, 50, 34, 54, 76};
       int n = sizeof(nums) / sizeof(nums[0]);
       cout << "快速排序前: ";
       for (int i = 0; i < n; i++) {
           cout << nums[i] << " ";
       }
       cout << endl;
       quickSort(nums, 0, n - 1);
       cout << "快速排序后: ";
       for (int i = 0; i < n; i++) {
           cout << nums[i] << " ";
       }
       cout << endl;
       return 0; }
   
           cout << nums[i] << " ";
       }
       cout << endl;
       return 0; 
       }

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值