快速排序 从理解到掌握
来源:互联网 发布:帝国全面战争 知乎 编辑:程序博客网 时间:2024/06/07 21:48
首先我们先来看下快速排序算法的原理:
【1】从数组中取得一个“标志数字”(没有要求,可以随便取,一般取第一个);定义两个位置变量 “i” ,“j” ;“i” 左边找大于等于“标志数字”的数 ,“i”从右边找小于等于“标志数字”的数;找到后两者交换位置
【2】直到以该数字为标志, 实现该数字的左边都是小于等于该数字的数,右边都是大于等于该数字的数
【3】然后对该标志位左边和右边的部分数组分别指向上面两步
例如: 1,2,3,5,0,1
【1】取的数字 1 为“标志数字” 任意取 那个都行 一般默认数组第一个数字
【2】第 一 次寻找 两边的1 相互交换位置 注意 这时的“标志数字”是后一个1
【结果】 1 2 3 5 0 1;
【2】第 二 次【这时i++了一次j--了一次】寻找第一个小于等于的“标志数字”的值为(0) 大于等于的为(2) 交换位置
【结果】 1 0 3 5 2 1;
这是i j已将相遇 (i>=j)
在相遇位置 数字3 左边都是小于等于“标志数字”的 右边都是大于等于“标志数字”的
【3】将数组分为 1 0 - 3 5 2 1两个子数组递归调用【1】【2】
【1】取的数字 1 为“标志数字”
【2】寻找左开始寻找大于等于1的找到(1) 又开始寻找小于等于1的找到(0)
【结果】 0 1 - 3 5 2 1
【1】取标“标志数字”3
【2】找到3 1交换位置
【结果】 0 1 - 1 5 2 3
【2】找到5 2交换位置
【结果】 0 1 - 1 2 5 3
【3】递归排序1 2 -5 3
...
【1】标志数字 5
【2】 找到5 3交换位置
【结果】 0 1 - 1 2 - 3 5
【1】从数组中取得一个“标志数字”(没有要求,可以随便取,一般取第一个);定义两个位置变量 “i” ,“j” ;“i” 左边找大于等于“标志数字”的数 ,“i”从右边找小于等于“标志数字”的数;找到后两者交换位置
【2】直到以该数字为标志, 实现该数字的左边都是小于等于该数字的数,右边都是大于等于该数字的数
【3】然后对该标志位左边和右边的部分数组分别指向上面两步
例如: 1,2,3,5,0,1
【1】取的数字 1 为“标志数字” 任意取 那个都行 一般默认数组第一个数字
【2】第 一 次寻找 两边的1 相互交换位置 注意 这时的“标志数字”是后一个1
【结果】 1 2 3 5 0 1;
【2】第 二 次【这时i++了一次j--了一次】寻找第一个小于等于的“标志数字”的值为(0) 大于等于的为(2) 交换位置
【结果】 1 0 3 5 2 1;
这是i j已将相遇 (i>=j)
在相遇位置 数字3 左边都是小于等于“标志数字”的 右边都是大于等于“标志数字”的
【3】将数组分为 1 0 - 3 5 2 1两个子数组递归调用【1】【2】
【1】取的数字 1 为“标志数字”
【2】寻找左开始寻找大于等于1的找到(1) 又开始寻找小于等于1的找到(0)
【结果】 0 1 - 3 5 2 1
【1】取标“标志数字”3
【2】找到3 1交换位置
【结果】 0 1 - 1 5 2 3
【2】找到5 2交换位置
【结果】 0 1 - 1 2 5 3
【3】递归排序1 2 -5 3
...
【1】标志数字 5
【2】 找到5 3交换位置
【结果】 0 1 - 1 2 - 3 5
【4】直到最后每个子数组的成员只有一个 排序完成
static void QuickSort(int[] num, int l=0, int r=0) { if (r == 0) r = num.Length - 1; int i = l; int j = r; int sign = num[i]; while (i<= j ) { if (num[i] < sign) i++; else if (num[j] > sign) j--; else { int tmp = num[i]; num[i] = num[j]; num[j] = tmp; #region 中间为调试输出的内容 以方便大家查看每次的交换情况 Console.ForegroundColor = ConsoleColor.White; Console.Write("i={0},j={1},sign={2},时{3}和{4}交换;", i,j, sign,num[j], num[i]); Console.WriteLine(); for (int z = 0; z < num.Length; z++) { if (z == i || z == j) Console.ForegroundColor = ConsoleColor.Red; else Console.ForegroundColor = ConsoleColor.White; Console.Write(num[z]+" "); } Console.WriteLine(); #endregion i++; j--; } } if (l < j) QuickSort(num, l, j); if (r > i) QuickSort(num, i, r); }
阅读全文
1 0
- 快速排序 从理解到掌握
- 全面掌握快速排序
- 从三色旗算法到快速排序
- 快速排序算法从入门到提高
- 排序算法之--从冒泡排序到快速排序
- 几个排序算法总结,从冒泡到快速排序
- 快速理解掌握gulp用法
- 快速理解快速排序
- 分分钟掌握快速排序
- Volley从入门到掌握
- RequireJS 从陌生到掌握
- SQL,从熟练到掌握
- 从快速排序开始
- PID的快速理解与掌握
- 快速排序的理解
- 快速排序(更好理解)
- 快速排序(更好理解)
- 进一步理解快速排序
- JAVA设计模式之单例模式
- 归纳法、演绎法、数学归纳法之间的关系
- C++ 基本语法
- 爱上Markdown--基础入门篇
- [知了堂学习笔记]_jQuery的事件
- 快速排序 从理解到掌握
- mysql 批量更新 update foreach
- 经典算法之直接插入排序及其优化
- SSH三大框架的整合
- JAVA数据存储位置
- MD5
- linux配置定时器crontab
- Postprocessing of stereo vision
- Reactive Web Applications.pdf 英文原版 免费下载