排序算法之快速排序
时间:2020-04-11
本文章向大家介绍排序算法之快速排序,主要包括排序算法之快速排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法描述:
快速排序也使用分治思想,其过程为:
分解:将原数组划分为两个子数组,但要求左边数组的每个元素都小于右边数组的每个元素。
解决:通过递归调用快速排序,对子数组进行排序。
合并:因为子数组是原址排序,所以不需要合并操作。
快速排序划分数组的方法:
1. 单方向遍历
选择最后一个元素为基准元素。记为x。
定义如下几个计数变量:
i:闭区间[0, i]内的元素都≤x
j:开区间(i, j)内的元素都>x,j为遍历使用的变量
代码解释:每次发现一个≤x的元素,都会放到第一个区间内,即[0,i]区间内,然后j++。
int divide(int low, int high) { int x = data[high]; int i = low - 1; // 初时<=x的区间为空 // 从第一个元素开始遍历,不包括基准元素 for(int j = low; j < high; j++) { if(data[j] <= x) { // 将该元素放入区间[low, i] i = i + 1; // 区间扩大一个元素 swap(data[i], data[j]); } } swap(data[i+1], data[high]) return i + 1; }
2. 双向遍历
int divide(int low, int high) { int x = data[high]; while(low < high) { // 从左向右寻找>x的元素 while(low < high && data[low] <= x) { low++; } data[high] = data[low]; // 从右向左寻找<x元素 while(high > low && data[high] >= x) { high--; } data[low] = data[high]; } data[low] = x; return low; }
排序算法实现:
void QuickSort(int low, int high) { int mid = divide(low, high); if(low < high) { QuickSort(low, mid - 1); QuickSort(mid + 1, high); } }
时间复杂度分析:
快速排序的时间复杂度依赖于划分是否平衡,而平衡与否又依赖于用于划分的元素。
如果划分平衡,则其算法性能与归并排序一致,为O(nlgn)。
稳定性分析:
快速排序是不稳定的排序算法
原文地址:https://www.cnblogs.com/yanghh/p/12680091.html
- 《Netkiller Virtualization 手札》Docker 卷管理
- PHP高级编程之守护进程
- Spring boot with Docker
- Spring boot with Service
- Spring boot with PostgreSQL
- Struts2 S2-046, S2-045 Firewall(漏洞防火墙)
- 应用程序的通信成本
- Spring cloud 之 Feign Client
- Spring Cloud Netflix
- 重新整理AUTO_INCREMENT字段
- Spring Cloud Config
- Spring boot with Schedule (启用/禁用)
- DevOps Tools
- Docker 虚拟机之 Redis
- 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 数组属性和方法
- 自定义 ESLint 规则,让代码持续美丽
- 基于Java swing开发的雷霆战机
- 浅谈双缓冲技术在游戏里面的应用【java】
- 拥抱 Vue 3 系列之 JSX 语法
- c#多态性 静态多态性函数重载 动态多态性 虚方法:
- 如何开发跨框架的组件
- ZooTeam 拍了拍你,来看看如何设计动态化表单
- C# 继承 基类和派生类基类的初始化C# 多重继承
- Go语言ORM-gorm学习笔记(一)
- Etcd+Prometheus+Grafana
- 梳理 6 项 webpack 的性能优化
- 第2章 Jenkins Server的安装部署方式
- 在MacOSX机器上设置JenkinsCI服务器
- springboot2配置文件定义${user.name}内容失效问题探究
- 重学Javascript之数据类型