需要递归的排序方式:快速排序归并排序算法分析
来源:互联网 发布:karunesh 知乎 编辑:程序博客网 时间:2024/05/16 12:58
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
以一个数组作为示例,取区间第一个数为基准数。
0
1
2
3
4
5
6
7
8
9
72
6
57
88
60
42
83
73
48
85
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;
数组变为:
0
1
2
3
4
5
6
7
8
9
48
6
57
88
60
42
83
73
88
85
i = 3; j = 7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
快速排序函数段如图所示,
int quicksort(vector<int> &v, int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
}
v[low] = key;
quicksort(v,left,low-1);
quicksort(v,low+1,right);
}
}
这样通过先递归的分解数列,再合并数列就完成了归并排序。
归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。
- 需要递归的排序方式:快速排序归并排序算法分析
- 插入排序、归并排序和递归算法的复杂性分析
- 插入排序、归并排序和递归算法的复杂性分析
- 归并排序的递归算法
- 快速排序(递归算法)分析
- 归并排序递归算法
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 递归算法——归并排序,快速排序,二分查找
- 分治+递归:归并排序的递归算法
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序),算法分析以及改进
- 排序算法2-快速排序、归并排序
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 插入排序、归并排序、快速排序的比较和分析
- 三大面试排序的归并以及递归实现--快速排序、归并排序、堆排序
- 常用的排序算法性能分析(2)—— 归并排序、快速排序
- AndroidStudio 新手常遇到的错误以及解决办法
- log4j区分不同客户端产生的日志
- 解决VS2010在程序根目录生成ipch文件夹和.sdf格式文件问题以及右键查看变量申明和定义按钮变灰
- 模拟账户查询,实现存取款
- TCP的三次握手四次挥手
- 需要递归的排序方式:快速排序归并排序算法分析
- JavaScript中的正则表达式对象1--创建
- MySQL远程访问
- 该学习了
- Error:Execution failed for task ':XXXX:processDebugManifest'. > Manifest merger failed with multiple
- Hrbust 2143 积分大小【dp】
- Leetcode | Binary Tree Inorder Traversal
- 如何实现UDP的可靠传输
- LeetCode 189. Rotate Array