C++ 快速排序 个人笔记
发布日期:2021-07-27 05:26:58
浏览次数:4
分类:技术文章
本文共 2109 字,大约阅读时间需要 7 分钟。
C++ 快速排序 个人笔记
快速排序的代码实现
源代码
#include/******************************函数参数: arr - 数组名* begin - 开始遍历的数组下标* end - 最后一个遍历的数组下标**函数作用: 在begin 到end 区间内 让arr[begin]* 这个元素移到左边小于arr[begin]* 右边大于arr[begin]的位置上去**函数返回值: 如果begin < end 就返回arr[begin]这个数据* 现在所在的数组下标else return -2;*******************************/int quickMethod(int * arr, int begin,int end) { int middleNum = arr[begin];//miuddleNum 保存arr[begin]这个元素 int i = begin; //i 保存开始遍历的数组下标 int j = end; //j 这个遍历区间的最后一个数组下标 //if(begin< end)在这里应该是多于的 如果begin>end 都进不来这个函数 if (begin < end) { //先从最里面的循环看 //重复循环一下过程 直到i ==j 循环结束 while (i < j) { //第一次外层循环时 //只要i middleNum) { arr[j--] = arr[i]; break; } else { i++; } } } //此时i和j指向同一个元素,而这个元素是可以被覆盖的 arr[i] = middleNum; return i; } else { return -2; }}/******************************函数参数: arr - 数组名* begin - 开始遍历的数组下标* end - 最后一个遍历的数组下标**函数作用: 将arr进行快速排序**函数返回值: 无*******************************/void quickSort(int* arr, int begin, int end) { int index = -1;//index 保存基数下标 if (begin < end) { index = quickMethod(arr, begin, end); if (index == -2) { exit(-2); } //index 这个下标以左递归再进行快速排序 quickSort(arr, begin, index - 1); //index 这个下标以右递归再进行快速排序 quickSort(arr, index + 1, end); }}int main(void) { int test[] = { 163, 161, 158, 165, 171, 170, 163, 159, 162 }; int len = sizeof(test) / sizeof(test[0]); quickSort(test,0,len-1); for (int i = 0; i < len; i++) { printf("%d\t", test[i]); } return 0;}
代码的测试
快速排序的原理(个人理解)
如果看不懂,下面还有我老师的图文讲解
以升序排列(从小到大排列为例)
1、在一组待排序的数据中首先找任意一个元素当基准值,虽说是任意但你不知道这组数据有多少个,容易越界,最好选第一个元素或最后一个元素)。
定义二个变量 i指向第一个元素的下标,j指向最后一个元素的下标。
假如是选的是第一个元素当基准值,
2、然后从j开始往前遍历找到比这个基准值小的数据(j–直到比这个基准值小的数据结束循环),比这个基准值小的数据(j下标中的数据)赋值到当前i下标的位置上,然后i++;让i指向下一个数组下标 ,这个i数组下标中的元素就是小于基准值的 而j这个下标中的元素是可以被覆盖的,相当于一个坑,需要填起来。
3、从i下标开始往后遍历比这个基准值大的的数据(i++直到比这个基准值大的数据结束循环)比这个基准值大的的数据(i下标)赋值到当前j下标的位置上(坑);这个j下标中的元素就是大于基准值的,而i这个下标中的元素是可以被覆盖的,相当于一个坑,需要填起来。
4.不断循环2-3步骤(直到i<j)循环结束;
5、此时i == j ;i下标或j下标中的元素就是最后一个坑,用保存的基准值赋值到这个位置上,这个位置左边就是小于这个基准值右边是大于基准值的(但不一定是有序的)
6、再利用分治手法 以 index(基准值的位置)为界分成二组数据再进行1-5的步骤
转载地址:https://blog.csdn.net/qq_45569601/article/details/105686675 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年09月22日 13时09分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
jenkins + maven+ gitlab 自动化部署
2019-05-27
Pull Request流程
2019-05-27
Lambda 表达式
2019-05-27
函数式数据处理(一)--流
2019-05-27
java 流使用
2019-05-27
java 用流收集数据
2019-05-27
java并行流
2019-05-27
CompletableFuture 组合式异步编程
2019-05-27
mysql查询某一个字段是否包含中文字符
2019-05-27
Java中equals和==的区别
2019-05-27
JVM内存管理及GC机制
2019-05-27
Java:按值传递还是按引用传递详细解说
2019-05-27
Java中Synchronized的用法
2019-05-27
阻塞队列
2019-05-27
linux的基础知识
2019-05-27
接口技术原理
2019-05-27
五大串口的基本原理
2019-05-27
PCB设计技巧与注意事项
2019-05-27
linux进程之间通讯常用信号
2019-05-27
main函数带参数
2019-05-27