排序---java---黑马

排序算法

名称平均时间复杂度最好情况最坏情况空间复杂度稳定性
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) N N N
堆排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( 1 ) O(1) O(1) N N N
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y
希尔排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( n l o g n ) O(nlogn) O(nlogn) O ( 1 ) O(1) O(1) N N N
归并排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) Y Y Y
快速排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( l o g n ) O(logn) O(logn) N N N
计数排数 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( k ) O(k) O(k) Y Y Y
桶排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n 2 ) O(n^2) O(n2) O ( n + k ) O(n+k) O(n+k) Y Y Y
基数排序 O ( n × k ) O(n×k) O(n×k) O ( n × k ) O(n×k) O(n×k) O ( n × k ) O(n×k) O(n×k) O ( n + k ) O(n+k) O(n+k) Y Y Y

一、冒泡排序

递归版

在这里插入图片描述

非递归

public class BubbleSort{public static void sort(int[] a) {}public void bubble(int[] a) {int j = a.length - 1;int x = 0;while (true) {for(int i = 0; i < j - 1; i++) {if (a[i] > a[i + 1]) {swap(a, i, i + 1);x = i;  }}j = x;if (j == 0) {break;}}}private void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}
}

二、选择排序

在这里插入图片描述

public class SelectSort{public static void sort(int[] a) {for(int i = a.length - 1; i > 0; i--) { int max = i;for(int j = 0; j < i; j++) {if (a[j] > a[max]) {max = j;}}if (max != i) {swap(a, i, max);} }}private void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}   
}

堆排序

public class HeapSort() {public static void sort(int[] a) {heapify(a, a.length);for(int i = a.length - 1; i > 0; i--) {swap(a, 0, i);down(a, 0, i);}}public static void heapify(int[] array, int size) {for(int i = size / 2 - 1; i >= 0; i--) {down(array, i, size);}}public static void down(int[] array, int parent, int size) {int left = 2 * parent + 1;int right = left + 1;int max = parent;if (left < size && array[left] > array[max]) {max = left;}if (right < size && array[right] > array[max]) {max = right;}if (max != parent) {swap(array, max, parent);down(array, max, size);}}public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

插入排序

递归实现

public class InsertSort{public static void sort(int[] a) {insert(a, 1);}public static void insert(int[] a, int low) {if (low == a.length) {return ;}int t = a[low];int i;for(i = low - 1; i >= 0 && a[i] > t; i--) {a[i + 1] = a[i];}if (i + 1 != low) {a[i + 1] = t;}insert(a, low + 1);}
}
public class InsertSort{public static void sort(int[] a) {insert(a, 1);}public static void insert(int[] a, int low) {if (low == a.length) {return;}int temp = a[low];int i = low - 1;while (i >= 0; a[i] > temp) {a[i + 1] = a[i];i--;}if (i + 1 != low) {a[i + 1] = temp;}insert(a, low + 1);}
}

非递归实现

public class InsertSort {public static void sort(int[] a) {for(int i = 1; i < a.length; i++) {int temp = a[i];for(int j = i - 1; j >= 0 && a[j] > a[i]; j--) {a[j + 1] =a[j];}if(j != i - 1) {a[j + 1] = temp;}}}
}
public class InsertSort {public static void sort(int[] a) {for(int i = 1; i < a.length; i++) {int temp = a[i];int j = i - 1;while (j >= 0 && a[j] > temp) {a[j + 1] = a[j];}if(j != i - 1) {a[j + 1] = temp;}}}
}

希尔排序

在这里插入图片描述

public class ShellSort{public static void sort(int[] a){for(int gap = a.length >> 1; gap >= 1; gap = gap >> 1) {for(int i = gap; i < a.length; i++) {int temp =  a[i];int j = i - gap;while (j >= 0 && a[j] > temp) {a[j + gap] = a[j];j -= gap;}if (j + gap != i) {a[j + gap] = temp;}}}}
}

归并排序

在这里插入图片描述

递归方法

public class MergeSort{public static void sort(int[] a) {int[] a2 = new int[a.length];merge(a, 0, a.length - 1, a2);}public static void split(int[] a, int left, int right, int[] a2) {if (left == right) {return;}int m = (left + right) >>> 1;split(a, left, m, a2);split(a, m + 1, right, a2);// 合并操作merge(a, left, m, m + 1, right, a2);System.arraycopy(a2, left, a, left, right - left + 1);}public static void merge(int[] a1, int i, int iend, int j, int jend, int[] a2) {int k = i;while (i <= iend && j <= jend) {if (a1[i] <= a1[j]) {a2[k] = a1[i];i++;} else {a2[k] = a1[j];j++;}k++;}if (i > iend) {System.arraycopy(a1, j, a2, k, jend - j + 1);} if (j > jend) {System.arraycopy(a1, i, a2, k, iend - i + 1);}}
}

非递归方式


归并加插入

public class MergeInsertionSort{public static void insertion(int[] a, int left, int right) {for(int i = left + 1; i <= right; i++) {int t = a[i];int j = i - 1;while (j >= left && a[j] > t) {a[j + 1] = a[j];j--;}if (i != j + 1) {a[j + 1] = t;}}}public static void merge(int[] a, int i, int iend, int j, int jend, int[] a2) {int k = 0;while (i <= iend && j <= jend) {if (a[i] <= a[j]) {a[k] = a[i];i++;} else {a[k] = a[j];j++;}k++;}if (j > jend) {System.arraycopy(a, i, a2, k, iend - i + 1);}if (i > iend) {System.arraycopy(a, j, a2, k, jend - j + 1);}}public static void split(int[] a, int i, int j, int[] a2) {if (i == j) {// 插入排序insertion(a, i, j);return;}int m = (i + j) >>> 1;split(a, i, m);split(a, m + 1, j);// 合merge(a, i, m, m + 1, j, a2);System.arraycopy(a2, left, a, left, j - i + 1);}
}

快排

单边循环

在这里插入图片描述
在这里插入图片描述

public class QuickSortLomuto{public static void sort(int[] a) {quick(a, 0, a.length - 1);}public static void quick(int[] a, int left, int right) {if (left >= right) {return;}int p = partition(a, left, right);quick(a, left, p - 1);quick(a, p + 1, right);}public static int partition(int[] a, int left, int right) {int pv = a[right];int i = left;int j = right;while (i < j) {if (a[j] < pv) {if (i != j) {swap(a, i, j);}i++;}j++;}swap(a, i, right);return i;}public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

双边循环

在这里插入图片描述

注意事项

  • 加内层循环的i < j 条件
  • 先处理j,后处理i
  • 随机元素作为基准点
public class QuickSortLomuto{public static void sort(int[] a) {quick(a, 0, a.length - 1);}public static void quick(int[] a, int left, int right) {if (left >= right) {return;}int p = partition(a, left, right);quick(a, left, p - 1);quick(a, p + 1, right);}public static int partition(int[] a, int left, int right) {int pv = a[left];int i = left;int j = right;while (i < j) {while (i < j && a[j] > pv) {j--;}while (i < j && a[i] <= pv) {i++;}swap(a, i, j);}swap(a, left, i);return i;}public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

改进

public class QuickSortLomuto{public static void sort(int[] a) {quick(a, 0, a.length - 1);}public static void quick(int[] a, int left, int right) {if (left >= right) {return;}int p = partition(a, left, right);quick(a, left, p - 1);quick(a, p + 1, right);}public static int partition(int[] a, int left, int right) {int pv = a[left];int i = left;int j = right;while (i <= j) {while (i <= j && a[i] < pv) {i++;}while (i <= j && a[j] > pv) {j--;}if (i <= j) {swap(a, i, j);}}swap(a, left, j);return j;}public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

计数排序

public class CountSort{public static void sort(int[] a) {int max = a[0];for(int num : a) {if (num > max) {max = num;}}int[] counts = new int[max + 1];for(int i = 0; i < a.length; i++) {counts[a[i]]++;}int k = 0;for(int i = 0; i < count.length; i++) {while (count[i] > 0) {a[k++] = i;count[i]--;}}} 
}

代码改进

public class CountSort{public static void sort(int[] a) {int max = a[0];int min = a[0];for(int num : a) {if (num > max) {max = num;}if (num < min) {min = num;}}int[] counts = new int[max - min + 1];//for(int i = 0; i < a.length; i++) {//    counts[a[i]]++;//}// 使用增强for循环for(int num : a) {counts[num - min]++;}int k = 0;for(int i = 0; i < counts.length; i++) {while (counts[i] > 0) {a[k++] = i + min;count[i]--;}}} 
}

桶排序

public clsss BucketSor{public static void sort(int[] a) {List buckets = new ArrayList[10];for(int i = 0; i < a.length; i++) {buckets[i] = new ArrayList();}for(int num : a) {buckets[num % 10] = num;}int k = 0;for(List bucket : buckets) {int[] array = new int[bucket.size()];if (bucket.size() > 0) {for(int i = 0; i < bucket.size(); i++) {array[i] = bucket.get(i);}}InsertSort.sort(array);for(int i : array) {a[k++] = i;}}} 
}

基数排序

public class RadixSort{public static void sort(String[] a, int length) {ArrayList<String>[] buckets = new ArrayList<>[10];for(int i = 0; i < 10; i++) {buckets[i] = new ArrayList<>();}for(int i = length - 1; i >= 0; i--) {for(String s : a) {bucket[s.charAt(i) - '0'].add(s);}int k = 0;for(ArrayList<String> bucket : buckets) {for(String s : bucket) {a[k++] = s;}bucket.clear();}}} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】网页交互的灵魂舞者

我的主页&#xff1a;2的n次方_ 1. JavaScript 的三种引入方式 引⼊⽅式 语法描述 ⽰例 ⾏内样式 直接嵌⼊到 html 元素内部 <input type"button" value"点我⼀下" οnclick"alert(haha)"> 内部样式 定义<script>标签&a…

PDF 软件如何帮助您编辑、转换和保护文件

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案&#xff0c;还是尝试组织和编辑主文档&#xff0c;PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时&#xff0c;请考虑这些因素。 1. 确定您的…

蒙特卡洛法面波频散曲线反演(matlab)

面波频散曲线反演是一种地震波形反演方法&#xff0c;用于估计地下结构的物理参数。其原理基于面波频散现象&#xff0c;即地震波在地下传播时会由于地下结构的变化而导致波速的变化&#xff0c;从而在地震记录中形成不同频率的相位延迟。具体而言&#xff0c;面波频散曲线反演…

Jmeter接口测试企业级项目实战day3

1.了解Jmeter的内部细节&#xff0c;排查错误的原因 取样器&#xff1a;发送请求&#xff0c;接受响应 -> 查看结果树请求和响应&#xff08;头和正文&#xff09; 断言&#xff1a;验证响应 ->查看结果树&#xff08;采样结果&#xff09; 提取…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

FreeRTOS学习笔记1

结合汇编 ldr r3, pxCurrentTCB ldr r2 R3 value0x20000054,R2 value0x2002B950 pxCurrentTCB 020028950 pxTopOfStsck 0x2002B8FC 解释这些寄存器的值是怎么变化的 1. ldr r3, pxCurrentTCB 这一行指令将 全局变量 pxCurrentTCB 的地址加载到寄存器 r3 中。pxCu…

【网络】详解TCP协议的延时应答、捎带应答、异常处理

【网络】详解TCP协议的延时应答和捎带应答 一. 延时应答模型 二. 捎带应答模型再谈四次挥手 三. 异常处理1.一方出现进程崩溃2.一方出现关机&#xff08;正常流程关机&#xff09;3.一方出现断电4.网线断开 一. 延时应答 也是基于滑动窗口&#xff0c;想要尽可能的去提高效率。…

用Java爬虫API,轻松获取taobao商品SKU信息

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是商品管理的基础。对于商家来说&#xff0c;SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一&#xff0c;提供…

制药企业MES与TMS的数据库改造如何兼顾安全与效率双提升

*本图由AI生成 在全球制造业加速数字化转型的浪潮中&#xff0c;一家来自中国的、年营业额超过200亿元的制药企业以其前瞻性的视角和果断的行动&#xff0c;成为该行业里进行国产化改造的先锋。通过实施数据库改造试点项目&#xff0c;该企业实现了其关键业务系统MES&#xff0…

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

【初阶数据结构】归并排序 - 分而治之的排序魔法

文章目录 前言1. 什么是归并排序&#xff1f;1.1 归并排序的步骤 2. 归并排序的代码实现2.1 归并排序代码的关键部分讲解2.1.1 利用递归2.1.2 将拆解的数组的元素放到一个临时空间中进行重新排序2.1.3 将在临时空间中排好的数组复制到目标数组中 3. 归并排序的非递归写法 前言 …

CTFHub | HTTP协议 - 请求方式 | 题解实操

CTFHUB 的 HTTP 请求方式题目为参与者带来了独特的挑战和学习机会。在这个题目中&#xff0c;要求参与者使用特定的方式请求来获取 flag。这不仅考验了参与者对 HTTP 请求方法的理解和掌握程度&#xff0c;还促使他们探索不同的工具和技术来解决问题。 题目背景设定在网络安全…

关于MyBatis-Plus 提供Wrappers.lambdaQuery()的方法

实例&#xff1a; private LambdaQueryWrapper<XXX> buildQueryWrapper(XXXBo bo) { Map<String, Object> params bo.getParams(); LambdaQueryWrapper<XXX> lqw Wrappers.lambdaQuery(); lqw.eq(bo.getOrgId() ! null, XXX::getOrgId, bo.getOrgId()); lq…

拼三角问题

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 一题目&#xff1a; 二思路&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; 题目链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 二思路&#xff1a; 思路&#xff1a;首先明白能组成三角形…

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?

随着生物信息学在科研和教育中的快速普及&#xff0c;越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而&#xff0c;在面对这些大规模数据时&#xff0c;个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼&#xff1f; 这篇文章将为你提…

JavaWeb——Maven(4/8):Maven坐标,idea集成-导入maven项目(两种方式)

目录 Maven坐标 导入Maven项目 第一种方式 第二种方式 Maven坐标 Maven 坐标 是 Maven 当中资源的唯一标识。通过这个坐标&#xff0c;我们就能够唯一定位资源的位置。 Maven 坐标主要用在两个地方。第一个地方&#xff1a;我们可以使用坐标来定义项目。第二个地方&#…

FreeRTOS - 软件定时器

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 1. 软件定时器 软件定时器也可以完成两类事情…

Spring AI Alibaba 接入国产大模型通义千问

整体介绍 本文是一个详细的例子&#xff0c;讲解了如何基于spring ai 来调用通义千问国产大模型&#xff0c;有详细的代码和配置&#xff0c;并且免费。 Spring AI&#xff1a;简化Java开发者构建AI应用的统一框架 在过去&#xff0c;Java 开发者在构建 AI 应用时面临的一大…

【ios】解决xcode版本过低无法真机调式的问题

最低要求和支持的 SDK&#xff1a;Xcode - 支持 - Apple Developer 我的Xcode版本是14.2 手机系统版本是iOS15.8.3 步骤一 在终端中运行 open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 步骤二 先去https://github.com/fi…

AI 设计工具合集

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; ​ 前言: AI 视频&#xff0c;科技与艺术的精彩融合。它借助先进的人工智能技术&#xff0c;为影像创作带来全新可能。本书…