简谈快速排序
来源:互联网 发布:金融类软件测试 编辑:程序博客网 时间:2024/06/05 03:33
最近在看算法导论,其实想很快看过去,看到快速排序时,看着他那官方的解释,总感觉耽搁了自己看书的速度,自己理解了后想写一篇能够让其他人能够快速理解快速排序的文章,这就是写这篇博客的原因。
快速排序关键思想:
取一个数(比如说一个数组最后的一个数),然后调整数组,使这个数组前半部分小于这个数,后半部分大于这个数,然后对前后半部分递归使用快速排序。
比如最开始是这个样子的数组
调整后
21387564可以看出前面三个数小于4,后面四个数大于4最后可以调整成这个样子
21347568
接下来就可以对4的前面部分和后面部分分别进行快速排序了,就可以完成整个排序了。是不是还是一脸懵逼,猜对了,我们可以发现,快速排序的关键就是找到一种方法完成上述三个步骤,怎么实现的呢?假设如下是个中间状态,前j-1个数中可以明显看出分为俩部分了,j是用来循环遍历的,j此时下面的数字是3,比4小,该怎么做呢?
pi j r21783564将3与7交换位置,就可以了对不对?然后i+1,j+1变成下面这个样子:p i j r21387564循环时,对所有数字都这样处理就完成了对吧?代码如下:
#include<iostream> using namespace std;int PARTITION(int A[], int p, int r);void QUICKSORT(int A[], int p, int r);int main(void){int A[] = { 2, 8, 7, 1, 3, 5, 6, 4 };QUICKSORT(A, 0, 7);for (int i = 0; i < 8; i++){cout << A[i] << " ";}return 0;}void QUICKSORT(int A[], int p, int r) //分治{if (p<r){int q = PARTITION(A, p, r);QUICKSORT(A, p, q - 1);QUICKSORT(A, q+1, r);}}int PARTITION(int A[], int p, int r) //关键的<span style="color: rgb(255, 102, 0);">调整数组,使这个数组前半部分小于这个数,后半部分大于这个数</span>{int x = A[r]; //取最后一个数做比较int i = p - 1; //i表示前面的i-1个数比x小了int a; //用于交换for (int j = p; j < r; j++) //遍历数组{if (A[j]<=x) //找到一个数小于等于最后一个数{i++;a = A[i];A[i] = A[j];A[j] = a; //<span style="color:#ff0000;">就交换A[i+1]与A[j],这个时候下标为0到i+1的数就比最后一个数小了,j继续循环,找下一个比最后一个数小的数</span>}}A[r] = A[i + 1];A[i + 1] = x; //最后把最后一个数放到中间return i + 1; //返回中间那个数的位置}这个是最后的结果图
1 0
- 简谈快速排序
- 再谈快速排序
- 再谈快速排序
- 再谈快速排序
- 快速排序最简实现
- C快速排序简说
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 0.1 Spark Streaming 实现思路与模块概述
- LeetCode 43. Multiply Strings(乘法)
- AfinalHttp的AjaxBack简单封装
- Java 连接hbase 进行简单操作
- C++第6次实验——项目一输出星号图
- 简谈快速排序
- 对象检测之行人检测(1)
- Effective cpp 读书笔记6
- 欢迎使用CSDN-markdown编辑器
- jQuery Ajax与prototypeJS Ajax数据获取的方式
- apache虚拟主机的配置
- 互补滤波器
- UITableViewCell分割线设置满屏
- Socket编程(一)---图解Socket