Java 几种排序算法 与时间空间复杂度
时间:2022-07-22
本文章向大家介绍Java 几种排序算法 与时间空间复杂度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//1.冒泡 2.插入 3.选择 4.快速 5.归并 6.希尔
public class Sort {
/**
* 冒泡排序 每次将最大的排到数组末尾
* 时间复杂度:n2 空间复杂度:1
*/
private void bubbleSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
----------------------------------------------------------------------------------
/**
* 插入排序 扑克牌排序
* 时间复杂度:n2 空间复杂度:1
*/
private void insertSort(int[] a) {
for (int i = 1; i < a.length; i++) {
int insert = a[i];
int j = i;
//j>=1防止下标越界
while (j >= 1 && a[j - 1] > insert) {
a[j] = a[j - 1];
j--;
}
a[j] = insert;
}
}
----------------------------------------------------------------------------------
/**
* 选择排序 每次选一个最小的放到数组最前面
* 时间复杂度:n2 空间复杂度:1
*/
private void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int min = i; //最小值索引
for (int j = i; j < array.length; j++) {
if (array[j] < array[min]) min = j;
}
int temp = array[i];//交换最小值与array[i]
array[i] = array[min];
array[min] = temp;
}
}
----------------------------------------------------------------------------------
/**
* 快速排序 取基准值 使左侧比其小右侧比其大 递归
* 时间复杂度 nlog2n 空间复杂度 nlog2n
*/
private void fastSort(int[] array) {
sortJob2(array, 0, array.length - 1);
}
private void sortJob(int[] array, int low, int high) {
if (low > high) return; //递归出口
int i = low, j = high, temp, key = array[low];
while (i < j) {
//一次交换两个非key值
while (i < j && array[j] > key) j--;
while (i < j && array[i] <= key) i++;
if (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
//交换Key和中间位置
temp = array[i];
array[i] = array[low];
array[low] = temp;
//递归
sortJob(array, low, i - 1);
sortJob(array, i + 1, high);
}
private void sortJob2(int[] array, int low, int high) {
int i = low, j = high, temp, key = array[low];
while (i < j) {
//交换key和右边应交换的值
while (i < j && array[j] > key) j--;
temp = array[j];
array[j] = array[i];
array[i] = temp;
//交换key和左边应交换的值
while (i < j && array[i] < key) i++;
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
if(low<i) sortJob2(array, low, i - 1);
if(i<high) sortJob2(array, i + 1, high);
}
----------------------------------------------------------------------------------
/**
* 归并排序 分成有序子列(长度为1认为有序)再合并 分阶段
* 时间复杂度: nlog2n 空间复杂度 n
*/
private void mergeSort(int[] a, int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
merge(a, low, mid, high);
}
}
/* 合并阶段 */
private void merge(int[] a, int low, int mid, int high) {
//申请一个合并后的空间
int[] temp = new int[high - low + 1];
// i/j: 两个待合并数组的指针 t: 合并后数组指针
int i = low, j = mid + 1, t = 0;
while (i <= mid && j <= high) {
if (a[i] < a[j]) {
temp[t++] = a[i++];
} else {
temp[t++] = a[j++];
}
}
//肯定只会走一个while循环:若其中一个数组还有未加入合并数组的 则直接加入
while (i <= mid) {
temp[t++] = a[i++];
}
while (j <= high) {
temp[t++] = a[j++];
}
//将临时数组里的数据复制到原数组 注意指针是k+low
for (int k = 0; k < temp.length; k++) {
a[k + low] = temp[k];
}
}
----------------------------------------------------------------------------------
/**
* 希尔排序
* 时间复杂度 n2 空间复杂度 1
*/
private void shellSort(int[] a) {
int d =a.length;
while (d>0){
for (int i = d; i < a.length; i++) {
int j = i;
int temp = a[j];
//应拿当前操作数进行比较
while (j>=d && temp<a[j-d]){
a[j] = a[j-d];
j-=d;
}
a[j] = temp;
}
d/=2;
}
}
- 碎片化 | 第四阶段-37-sturts2-登录功能实现-视频
- Spring Cloud Edgware新特性之六:Artifact ID变更
- 用 RNN 训练语言模型生成文本
- 碎片化 | 第四阶段-38-Struts2登录session对象封装-视频
- LeetCode实战:子问题分析
- 5分钟构建一个自己的无人驾驶车
- 碎片化 | 第四阶段-39-Struts2中session对象梳理-视频
- 用深度神经网络处理NER命名实体识别问题
- 碎片化 | 第四阶段-40-Struts组件分类讲解-视频
- nginx location配置
- 碎片化 | 第四阶段-41-struts2字节流生成验证码-视频
- Python|模块,包,标准模板
- 人脸识别应用之“变脸”
- 碎片化 | 第四阶段-32-Struts2列表展示-视频
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 最近,我用pandas处理了一把大数据……
- 【编译技术】:AST——基础的基础
- 【编译技术】:Babel——基础的基础
- 【编译技术】:解读 Babel AST Format——01
- 【编译技术】:解读 Babel AST Format——02
- PyTorch入门笔记-PyTorch初见
- ssh 连接 Linux 服务器并安装 Anaconda
- Ant Design Vue 报错:Failed to resolve directive: ant-portal的解决办法
- 小程序生成二维码海报的组件-wxa-plugin-canvas
- kbone 是什么?这可能是最好的小程序开源框架
- jQuery根据填写的input的数值导出excel表格
- 小程序根据返回值英文渲染出对应的中文
- redis灵魂拷问:聊一聊AOF日志重写
- 小程序返回的时间戳转化成时间
- JSP 报错:ReferenceError: $ is not defined