一、前后指针法

基本思路:
1.将数组的第一个数a[left]作为基准数key。
2.分区过程:right开始向前找比key小的数(end找小);数组的首元素left开始向后找比key大的数(begin找大);找到后然后两者交换(swap),直到begin >= end终止遍历。最后将begin和最后一个数交换( 这个时候end不是最后一个位置),即 key作为中间数(左区间都是比key小的数,右区间都是比key大的数)
3.再对左右区间重复第二步,直到各区间只有一个数。

 void QuickSort(int* a, int begin, int end)
{if (begin < end){int left = begin;int right = end;int temp = a[left];while (left != right){while (left < right&&a[right] >= temp)right--;while (left < right&&a[left] <= temp)left++;swap(a[left], a[right]); }swap(a[left], a[begin]);QuickSort(a, begin, left-1);QuickSort(a, left + 1, end);}
}
void print(int* a)
{for (int i = 0; i < 6; i++){cout << a[i] << " ";}cout << endl;
}
int main()
{int a[6] = { 9,5,7,6,8,0 };cout << "左右指针法:" << endl;QuickSort(a, 0, 5);print(a);system("pause");return 0;
}

二、挖坑法

挖坑法的快排跟前后指针法很相似
基本思路:
定义两个指针left指向起始位置,right指向最后一个元素的位置,然后指定一个基数key(right),作为坑
left寻找比基数(key)大的数字,找到后将left的数据赋给right,left成为一个坑,然后right寻找比基数(key)小的数字,找到将right的数据赋给left,right成为一个新坑,循环这个过程,直到begin指针与end指针相遇,然后将key返回给那个坑(最终:key的左边都是比key小的数,key的右边都是比key大的数),然后进行递归操作。

//挖坑法的快排
void partSort(int* arr, int left, int right)
{if (left < right){int begin = left;int end = right;int temp = arr[end];  //三数取中while (begin != end){while (begin < end&&arr[begin] <= temp)begin++;if (begin < end)arr[end] = arr[begin];  //begin成为新坑 while (begin < end&&arr[end] >= temp)end--;if (begin < end)arr[begin] = arr[end];}arr[begin] = temp;partSort(arr, left, begin-1);partSort(arr, begin + 1, right);}}
void print(int* a)
{for (int i = 0; i < 6; i++){cout << a[i] << " ";}cout << endl;
}
int main()
{int a[6] = { 2,5,1,6,8,0 };cout << "挖坑法的快速排序:" << endl;partSort(a, 0, 5);print(a);system("pause");return 0;
}

三、前后指针法

基本思路:
定义两个指针,一前一后,cur(前)指向起始位置,prev(后)指向cur的前一个位置;选择数组最后一个元素作为key(right)
实现过程:cur找比key小的数,prev在cur没有找到的情况下,一直不动(即保证prev一直指向比key大的数);直到cur找到比key小的数(+ +prev && prev != cur时)然后++cur,prev仍然不动。
直到cur走到right前一个位置,终止循环。最后++prev,交换prev和right的值

//前后指针法
void PartSort3(int* a, int begin, int end)
{if (begin <= end){int temp = a[end];int cur = begin;int prev = begin - 1;while (cur < end){if (a[cur] < temp&&++prev != cur){swap(a[cur], a[prev]);}++cur;}prev++;swap(a[cur], a[prev]);PartSort3(a, begin, prev - 1);PartSort3(a, prev+1, end);}
}
void print(int* a)
{for (int i = 0; i < 6; i++){cout << a[i] << " ";}cout << endl;
}
int main()
{int a[6] = { 9,5,7,6,8,0 };cout << "前后指针法:" << endl;PartSort3(a, 0, 5);print(a);system("pause");return 0;
}

快速排序使用的场景是数据量大并且杂乱的序列,避免出现最坏的情况(为了让效率变得更高,使用了三数取中法,在数字大小小于10的时候,用直接插入排序,减少栈帧)

其中:

  • 快速排序最优的情况:当关键词位于序列正中间的时候
  • 快速排序最坏的情况:对已经有序的序列进行排序
  • 时间复杂度:O(N^2)最差,O(N*lgN)最好
  • 空间复杂度:O(1)
  • 稳定性:不稳定

【C++】——快速排序(前后指针,挖坑法,快慢指针法)相关推荐

  1. 【八大排序(五)】快排进阶篇-挖坑法+前后指针法

  2. 数据结构与算法 | 快速排序:Hoare法, 挖坑法,双指针法,非递归, 优化

    前两章讲解了排序中的选择排序和插入排序,这次就来讲一讲交换排序中的快速排序. 快速排序时间复杂度:平均 O(nlogn) 最坏 O(n2) 快速排序,顾名思义,它的排序的效率是非常高的,在数据十分杂乱 ...

  3. C语言中调用数组元素的三种方法:下标法、数组名法、指针法

    /*调用数组元素的三种方法:下标法.数组名法.指针法*/ #include<stdio.h> int main() {int a[] = { 1,2,3,4,5 }, i, * p;pri ...

  4. 刷题算法:快慢指针法

    快慢指针法指的就是操作数组.链表及字符串等使用两个起点相同但前进步数不同的指针.相对于利用多次循环解决问题,快慢指针法的时间复杂度较低,执行效率高.对于快慢指针法根据题目可供调整的无非就为两点: 起点 ...

  5. 编程题:字符串的指针引用。用指针法实现。功能:将字符串str2复制连接到str1...

    编程题:字符串的指针引用.用指针法实现.功能:将字符串str2复制连接到str1 #include<stdio.h> void main() { char *s1,*s2, str1[30 ...

  6. 数组排序(5) 快速排序之三指针分区法

    目录 算法思想 三指针分区法 代码实现(Java) 时间复杂度 算法思想 当所有数的左边的数据都小于等于这个数,右边的数据都大于这个数时,数组就有序了. 三指针分区法 先初始化主元为首元,然后初始化三 ...

  7. c语言对用下标法二维数组遍历,二维数组遍历:下标法与指针法的较量

    在图像的采集中,常常需要用到二维数组,这里数组的遍历是指按照一定的顺序访问数组中所有的元素. 在众多的遍历方法中,下标法和指针法是两种常用的方法.但在使用的时候,我们只需要选择其中的一种,那么如何选择 ...

  8. c语言下标法与指针法,《C和指针》中关于指针与下标的问题

    int array[10],  说明数组元素为整形. 取得a的值,并把它与整形的长度(也就是4)相乘,就是根据下标a,乘以4(整形量所占内存的字节数),所得结果就是下标变量相对数组起始位置的偏移,也就 ...

  9. Python快慢指针法

    今天在做leetcode的202. 快乐数让人快乐不起来的数哈哈,快乐数比如82,有以下快乐的过程: ,, 不快乐的数比如2,有以下不快乐过程: ,,,,[], , ,,, ,,,[] 不会做呀,看解 ...

最新文章

  1. gb50243-2016通风与空调工程施工质量验收规范_《通风与空调工程施工质量验收规范》GB50243-2016 重点解读...
  2. linux 释放cache 内存
  3. 实验——Windows常用网络测试命令
  4. 如何使用Google Authenticator在ASP.NET Core中设置两因素身份验证
  5. AngualrJS之服务器端通信
  6. 匿名内部类探究——它是一个实例
  7. 免安装Oracle客户端使用PL/SQL
  8. javascript !-- //-- 与老的浏览器打交道
  9. 粒子群优化算法(2)离散粒子群算法
  10. 与虚拟机连接出现ora-12514错误解决方法
  11. Java 多并发之原子访问(Atomic Access)
  12. 3D模型欣赏:反派角色部落女战士 【3D游戏建模教程】
  13. 用Altium Designer的databaseLib文件连接MySQL数据库工具管理自己的元器件信息数据库
  14. mysql数据库备份机制_mysql备份机制有哪些
  15. JT/T-1078流媒体服务优化升级
  16. Oracle between and
  17. html如何设置hr 标签的线条粗细,设置hr标签的粗细
  18. Windows下常用网络命令
  19. 工程伦理慕课答案(带题目供复习)
  20. NYOJ203-三国志

热门文章

  1. aliyun-go-live-sdk
  2. 【MacOS】装 mac-win10 双系统(2017年的老mac,Intel芯片)
  3. 证件照小程序开发 | 自动抠图换背景换底色
  4. 【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案
  5. 每天一个js小demo --全选与反选
  6. 如何将word单词表中的汉字/英文删掉
  7. 国家质量基础设施(NQI)“一站式”公共服务平台建设方案
  8. 前端webpack打包配置
  9. 【python】【matplotlib】plt.scatter颜色大全
  10. 2014腾讯暑期实习生面试-TST计划