快速排序(一)——单趟排序
2022/3/11 23:25:47
本文主要是介绍快速排序(一)——单趟排序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
快速排序的单趟排序有三种,分别是hoare法、挖坑法、双指针法
个人比较喜欢最后一种的双指针法
所以下面的单趟排序将使用双指针法实现
一、基本思路
1、设置指针位置
cur:寻找比key小的数,找到比key小的数,和prev的下一位交换——丢到左边
prev:是左右区间的临时分界点,prev(右边)紧跟比key大的数
key:哨兵位或最终分界点,不参与比较,最后cur检索完毕时,和prev的下一位交换
第一种方式:key在最左边
以最左边的值作为key,由于key不参与比较,所以cur最开始指向key的下一位
第二种方式:key在最右边
以最右边的值作为key,cur指向第一位
下面的分析采用第一种
2、开始比较
侦察兵cur出发,找安全地,
找到没有地雷的点,士兵长跟着走一个位置,侦察兵和士兵长交换当前自身状态信息
没找到安全地,士兵长停下,(侦察兵喊人解决),侦察兵继续走
cur出发找比key小的,
找到了,则prev向右移动一个位置,prev和cur指向的数据交换
没找到比key小的,即找到大于等于key的,prev停下,cur继续走
(1)第一步:
(2)第二步:
找到的是比key小的,步骤同第一步
(3)第三步:
此时cur 指向 7,比 key大,prev停下,cur继续向右移动
(4)第四步:
cur指向 9,比key大,prev继续歇着,cur继续向右移动
(5)第五步:
cur指向3,比key小,prev往前走,两者交换数据
各种情况已经罗列了,下面就不继续分析了
(6)最后一步:
跳出循环的时候,我们需要把key值加入到 调整过的队列中,
key 是最终分界点,prev只是临时分界点
需要将prev和key交换
二、单趟排序代码实现
//单趟排序的范围是 [left , right] void SingleSort(int* a,int left,int right) { int prev, cur, key; prev = left; cur = left + 1; key = a[left]; //将最左边的值作为key值 while (cur<=right) { //若找到比key小的数,则交换 if (a[cur] < key) { //prev++; //Swap(a[cur], a[prev]); Swap(a[cur], a[++prev]); } cur++; } Swap(a[prev], a[left]); //将临时分界点替换为最终分界点 }
三、结果测试
int main() { int arr[] = { 6,1,2,7,9,3,4,5,10,8 }; SingleSort(arr, 0, sizeof(arr) / sizeof(arr[0]) - 1); for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
这篇关于快速排序(一)——单趟排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南