由快速排序到分治思想
时间:2022-05-03
本文章向大家介绍由快速排序到分治思想,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第一篇《由快速排序到分治思想》,非常赞!希望对大家有帮助,大家会喜欢!
快速排序是一种基于分治思想的排序算法 它主要分为以下几步
1、一个数组按切分元素分成两个数组,一个数组是大于切分元素的,另一个数组是小于切分元素的,
2、然后将这两个部分按上面的思路独立排序。
3、并将有序的子数组归并 得到一个完整的数组。
这中间的关键就在于切分。
代码实现
public class Quick {
private static void sort(Comparable[] a, int l0, int l1) {
// TODO Auto-generated method stub
if(l0 > l1) return; //做基本的判断
int l2=partition(a,l0,l1); //调用方法实现按切分 得到最终a所在位置
sort(a,l0,l2-1); //排序比a小的数组
sort(a,l2+1,l1); //排序比a大的数组
}
private static int partition(Comparable[] a, int l0, int l1) { //定义切分方法
int i=l0; int j=l1+1; //定义左右指针
Comparable v=a[0]; //获得切分元素
while(true){ 扫描左右
while(less(a[++i],v)) if(i==l1) break;
//调用 less方法做判断a[i] 和v 直到a[i]大于v时 或者 i 到数组末尾时才停止
while(less(v,a[j--])) if(j==l0) break;
//调用 less方法做判断a[j] 和v 直到a[j]小于v时 或者 i 到数组头时才停止
if(i>j) break; //做判断 如果作为切分调出循环
exch(a,i,j); 调用exch()方法来吧a[i]和a[j] 交换位置
}
exch(a,l0,j); //调用exch()方法 将v放入正确的位置
return j;
}
}
快速排序的特性
复杂度 NlgN 空间复杂度 lgN 其运行效率与切分元素值有关 一把在排序之前先随机整个数组。 快速排序也是最快的通用排序算法。
分治思想理念
分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题。所以他有三个要点
1、划分步:把输入的问题划分为k个子问题,并尽量使这k个子问题的规模大致相同
2、治理步:调用处理方法来处理问题。
3、组合步:组合步把各个子问题的解组合起来。
从快速排序到分治
在快速排序中将一个数组按切分元素分成两个数组就是在不同的划分步。然后将这两个部分按上面的思路独立排序 这就是治理步。 最后将所有的子数组归并到一个数组 就是组合步。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实现接口的契约测试
- java泛型总结
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录
- openGauss备机追数Catchup过程中主库写入阻塞问题
- openGauss830版本中对于备份模块的增强与当前问题