优雅的快排之分治与递归思想,透彻理解快排
创作时间:
作者:
@小白创作中心
优雅的快排之分治与递归思想,透彻理解快排
引用
CSDN
1.
https://blog.csdn.net/2402_82917618/article/details/139533474
快速排序是一种高效的排序算法,由英国计算机科学家东尼·霍尔提出。它通过分治和递归的思想,将一个数组分成两个子区间,再对子区间进行排序,最终实现整个数组的排序。本文将从基本概念、实现步骤到具体代码,深入浅出地讲解快速排序算法。
如上图所示,快速排序的核心思想是将一个数组分成两个子区间。具体步骤如下:
- 选择一个基准元素(通常是数组的第一个元素)
- 通过两个指针(i和j)从数组的两端向中间扫描
- i指针从左向右移动,直到找到一个大于等于基准元素的值
- j指针从右向左移动,直到找到一个小于等于基准元素的值
- 如果i和j没有相遇,则交换它们所指向的元素
- 重复上述过程,直到i和j相遇或交错
- 此时,数组就被分成了两个子区间:左边的元素都小于等于基准,右边的元素都大于等于基准
这个过程可以用下图表示:
红线表示第一次分区,蓝线表示对子区间的分区。每次分区后,都会产生两个子区间,这两个子区间都是有序的(将子区间看作一个整体)。为了对整个数组进行排序,只需要对这两个子区间分别进行排序。这就是分治思想的具体体现。
接下来,我们用C语言实现快速排序算法:
#include <stdio.h>
int n, q[100000];
void quick_sort(int q[], int l, int r) {
if (l == r) return; // 递归结束条件:子区间只有一个元素
int x = q[l], i = l - 1, j = r + 1; // x是分区的基准
while (i < j) {
while (q[++i] < x);
while (q[--j] > x);
if (i < j) {
int t = q[i];
q[i] = q[j];
q[j] = t;
}
}
// 递归调用
quick_sort(q, l, j); // 对左区间
quick_sort(q, j + 1, r); // 对右区间
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", q + i);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", q[i]);
return 0;
}
这段代码实现了快速排序算法的核心逻辑。quick_sort
函数接受数组、左边界和右边界作为参数。在函数内部,首先检查递归结束条件(子区间只有一个元素)。然后,通过两个指针(i和j)进行分区操作,并在必要时交换元素。最后,递归调用quick_sort
函数对左右两个子区间进行排序。
通过本文的讲解,相信读者已经对快速排序算法有了深入的理解。快速排序以其高效的性能和简洁的实现,成为了计算机科学中最重要的排序算法之一。
热门推荐
选美冠军李嘉欣的财富蝶变:从港姐到420亿商业女王
南京脑科医院专家详解:中风康复用药全攻略
如何辨别健康信息真伪?国家卫生健康委开设“健康科普辟谣平台”
从港姐到妈妈,李嘉欣13年婚姻生活后或重启演艺事业
硒元素:护肤界的抗氧化明星
江西宜春温汤镇:800年温泉古镇的健康密码
李嘉欣晒幸福:13岁儿子身高超妈,夫妻恩爱16年
温汤镇:富硒温泉引领健康管理新风尚
李嘉欣育儿观:不拘泥名校,专注独立思考与全面发展
从ICU到逆龄美人:李嘉欣的全方位保养秘诀
宜春温汤镇的富硒温泉,你泡了吗?
宜春温汤镇温泉旅游打卡指南
明月山一日游完全攻略:瀑布、栈道、温泉全打卡
宜春一日游打卡明月山和鼓楼
明月山网红小火车:宜春必打卡的高山观光之旅
宜春市一日游打卡网红景点
冬游宜春:明月山月亮湖&慈化寺
明月山打卡:宜春历史文化景点探秘
宜春一日游打卡莱公亭,揭秘千年古韵
宜春必打卡:明月山月亮湖、慈化寺、水口乡村森林公园
宜春新晋网红打卡地:丰城市唯美养生谷度假区
洛阳地铁2号线站点分布全解析:15个站点首末班时间及票价攻略
谷养康、红星二锅头:泡药酒专用酒全面对比指南
疫情下洁癖症防治:从专业治疗到自我调节
别再混淆!洁癖症和强迫症的5大区别
洁癖症:从症状识别到科学治疗
上吐下泻怎么办?六种方法助你缓解不适
林肯纪念堂:华盛顿特区必打卡景点
林肯纪念堂:华盛顿特区的历史瑰宝
探访华盛顿特区:两座纪念碑,一部美国史