数据结构—快速排序(续)
作者:小教学发布时间:2023-10-02分类:程序开发学习浏览:87
导读:引言:在上一篇中我们详细介绍了快速排序和改进,并给出了其中的一种实现方式-挖坑法但其实快速排序有多种实现方式,这篇文章再来介绍其中的另外两种-左右指针法和前后指针法。有了上一...
引言:在上一篇中我们详细介绍了快速排序和改进,并给出了其中的一种实现方式-挖坑法
但其实快速排序有多种实现方式,这篇文章再来介绍其中的另外两种-左右指针法和前后指针法。有了上一篇挖坑法的启示,下面的两种实现会容易许多。
一、左右指针法
首先进行“三数取中”
这样就完成了比4小的在左边,比4大的在右边。
就继续递归就好了。
下面是代码:
int mid_quick_number(int* arry, int left, int right) {
int mid = left + (right - left) >> 1;//去中间数防止普通求中间数溢出问题
if (arry[mid] > arry[left]) {
if (arry[right] > arry[mid]) {
mid = mid;
}
else if(arry[right]>arry[left]){
mid = right;
}
else {
mid = left;
}
}
else {
if (arry[right] < arry[mid]) {
mid = mid;
}
else if (arry[right] > arry[left]) {
mid = left;
}
else {
mid = right;
}
}
return mid;
}
//左右指针法
void dfs_quick_sort2(int* arry, int left, int right) {
if ((right - left) <= 0)return;
int mid = mid_quick_number(arry, left, right);
swap(arry + mid, arry + left);
int key = arry[left];
int start = left;
int end = right;
while (start < end) {
while (start < end && key <= arry[end]) {
end--;
}//右指针去找比key小的,停下
while (start < end && key >= arry[start]) {
start++;
}//左指针去找大的,停下
swap(arry + start, arry + end);//交换大的和小的
}
swap(arry + end, arry+left);//最后两个指针重合,将key与right或左的值交换
dfs_quick_sort2(arry, left, start - 1);
dfs_quick_sort2(arry, start + 1, right);
}
二、前后指针法
这样就可以把它拆分成两段,在对这两段进行递归即可。
下面来看代码:
//前后指针法
void dfs_quick_sort3(int* arry, int left, int right) {
if ((right - left) <= 0)return;
int mid = mid_quick_number(arry, left, right);
swap(arry + mid, arry + left);
int key = arry[left];
int cur = left;
int pre = left - 1;
while (cur <= right) {
while (cur <= right && arry[cur] >= key) {
cur++;
}
if (cur <= right) {
pre++;
swap(arry + cur, arry + pre);
}
}
if (pre == left-1)pre++;
dfs_quick_sort3(arry, left, pre);
dfs_quick_sort3(arry, pre + 1, cur - 1);
}
好了,这是本篇文章的所有内容了,希望对你有所帮助!
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版