数据结构中的七大排序(Java实现)

目录

一、直接插入排序

二、希尔排序

三、直接选择排序

四、堆排序

五、冒泡排序

六、快速排序

七、归并排序


一、直接插入排序

思想:

             定义i下标之前的元素全部已经有序,遍历一遍要排序的数组,把i下标前的元素全部进行排序,当遍历玩这个数组后,就已经排好序了。

代码如下:

public static void insertSort(int[] array) {for (int i = 1; i < array.length; i++) {int tmp = array[i];int j = i - 1;for(; j >= 0;; j--) {if(array[j] > tmp) {array[j + 1] = array[j];} else {break;}}array[j + 1] = tmp;}}

代码解析

                要使i下标之前的元素都有序,定义一个j下标,为i - 1;再用tmp记录i下标的位置只要j下标元素比tmp大,j下标的元素就要放到j+1下标,最后j走完后,再把最小的tmp放在j+1位置。

时间复杂度、空间复杂度、稳定性:

        时间:O(n^2)

        空间:O(1)

        稳定性:稳定


二、希尔排序

思想:

                希尔排序也称缩小增量排序,就是分次去进行排序越排到后面就会越有序每次间隔是gap,然后逐渐缩小,到最后间隔为0,也就是用我们的直接插入排序,数组越有序,速度也会越快。那么就很简单了,我们只需改一下直接插入排序每次排序的间隔,把他们分成不同组进行排序,直到最后间隔为0,就只剩一组,然后也是用直接插入排序,做最后一次排序,排完就是有序的了。

图式例:

代码如下:

public static void shellSort(int[] array) {int gap = array.length / 2;while (gap >= 1) {gap /= 2;shell(array, gap);}}public static void shell(int[] array, int gap) {for (int i = gap; i < array.length; i++) {int tmp = array[i];int j = i - gap;for(; j >= 0; j -= gap) {if(array[j] > tmp) {array[j + gap] = array[j];} else {break;}}array[j + gap] = tmp;}}

时间复杂度、空间复杂度、稳定性:

        时间:n^1.3(严蔚敏) 因为gap取值方式不同,计算出来的时间复杂度也会不同

        空间:O(1)

        稳定性:不稳定


三、直接选择排序

思想:

                直接选择排序也是和直接插入排序差不多,定义i下标前的元素全部都有序,不过排序的方式不同,它是拿i下标前的元素和i下标后的元素进行比较找到下标最小的元素把最小元素放进i下标中,同时这个i下标元素放到被这个最小下标位置。

代码实现:

public static void selectSort(int[] array) {for (int i = 0; i < array.length; i++) {int minIndex = i;//记录最小值的下标for (int j = i+1; j < array.length; j++) {if(array[j] < array[minIndex]) {minIndex = j;}}//走完这里,找到最小元素的下标minIndex//交换int tmp = array[i];array[i] = array[minIndex];array[minIndex] = tmp;}}

时间复杂度、空间复杂度、稳定性:

        时间:O(n^2)

        空间:O(1)

        稳定性:不稳定


四、堆排序

思想:

                堆其实就是完全二叉树,下标是从上到下,从左到右依次递增,要把堆排序成升序,就要把他先变成大根堆,每次出大根堆的顶点,把顶点放在最后一个节点,然后再向下调整一次第二次把大根堆的顶点放到倒数第二个位置,依次往后推。

代码实现:

//堆排序public static void heapSort(int[] array) {//先转换成大根堆createHeap(array);//开始换,然后向下转换for (int i = array.length - 1; i > 0 ; i--) {//i下标的节点和堆顶交换int tmp = array[0];array[0] = array[i];array[i] = tmp;//向下调整siftDown(array,0, i);}}
//创建大根堆public static void createHeap(int[] array) {//从最后一个父节点开始向下调整,下标依次往前减//parent = (child - 1) / 2; 左:child = parent * 2 + 1 右:child = parent * 2 + 2for (int i = (array.length - 1 - 1) / 2; i >= 0 ; i--) {siftDown(array, i, array.length);}}//向下调整public static void siftDown(int[] array, int parent, int length) {//定义一个child为该父节点的左孩子int child = parent * 2 + 1;while (child < length) {//比较改父节点的左右孩子,把值最大的孩子作为交换节点if(array[child] < array[child + 1]) {child += 1;}//比较父节点和孩子节点大小if(array[parent] < array[child]) {//交换int tmp = array[parent];array[parent] = array[child];array[child] = tmp;parent = child;child = child * 2 + 1;} else {break;}}}

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(1)

        稳定性:不稳定

五、冒泡排序

思想:

                冒泡排序的思想很简单,就是第一次把最大的值放到数组最后一个下标中,再把第二大的元素放到数组倒数第二个下标中,依次类推

代码实现:

 //冒泡排序public static void bubbleSort(int[] array) {for (int i = 0; i < array.length; i++) {boolean flag = false;//标记for (int j = 0; j < array.length - 1 - i; j++) {if(array[j] > array[j + 1]) {//交换int tmp =array[j];array[j] = array[j + 1];array[j + 1] = tmp;flag = true;}}if(!flag) {break;}}}

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(N^2)

        空间复杂度:O(1)

        稳定性:稳定


六、快速排序

思想:

                使用递归思想也可以采用非递归思想把一组数据划分成两部分左边都小于该下标元素,右边都大于该下标元素,再在左边去找元素划分,右边元素去划分,依次往后推,直到左右两边都没有元素可以划分了,就是只剩一个元素了,这时候往回倒,就有序了

代码实现:

public static void quickSort(int[] array) {int left = 0;int right = array.length - 1;quick(array, left, right);}public static void quick(int[] array, int start, int end) {//递归结束条件if(start >= end) {return;}int pivot = partition(array, start, end);quick(array, start, pivot - 1);quick(array, pivot + 1, end);}public static int partition(int[] array, int left, int right) {//找到一个下标元素,左边都比这个下标元素小,右边都比这个下标元素大,并且还要返回这个下标//记录下标为0的值,放在tmp中int tmp = array[0];while (left < right) {//先走右边if(left < right && array[right] >= tmp) {right--;}if(left < right && array[left] <= tmp) {left++;}//左下标的值大于tmp,右下标的值小于tmp,这两个下标值交换int newTmp = array[left];array[left] = array[right];array[right] = newTmp;}//走到这,left和right相遇了,left下标的值和tmp交换,并且返回这个位置的下标int newTmp = tmp;tmp = array[left];array[left] = newTmp;return left;}

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(logN~N)

        稳定性:不稳定


七、归并排序

思想:

                将一组数组分割成左右两部分,和快速排序找出的中件位置不同,归并的中间位置是最左和最右下标相加再除2(left+right)/ 2,运用的也是递归思想(也可以采用非递归思想,采用分治法,一直找到最左边进行排序,然后再找最右边进行排序,再往归回整体排序(合并)合并的时候是放在一个临时数组中,再把这个临时数组拷贝到原数组,下标要对应

代码实现:

public static void mergeSort(int[] array) {int start = 0;int end = array.length - 1;mergeSortFunc(array, start, end);}//套壳public static void mergeSortFunc(int[] array, int start, int end) {//递归结束标志if(start >= end) {return;}//求出中间节点位置int mid = (start + end) / 2;//左边mergeSortFunc(array, start, mid);//右边mergeSortFunc(array, mid + 1, end);//合并merge(array, start, mid, end);}//合并public static void merge(int[] array, int left, int mid, int right) {//定义mid两边的左右下标int s1 = left;int e1 = mid;int s2 = mid + 1;int e2 = right;//定义一个新的数组,存放array排序完后的数组int[] tmpArray = new int[right - left - 1];int k = 0;while (s1 <= e1 && s2 <= e2) {//比较左右两边s1和s2的值if(array[s1] < array[s2]) {tmpArray[k++] = array[s1++];} else {tmpArray[k++] = array[s2]++;}if(s1 <= e1) {tmpArray[k++] = array[s1++];}if(s2 <= e2) {tmpArray[k++] = array[s2++];}}//拷贝到原数组for (int i = 0; i < tmpArray.length; i++) {array[left + i] = tmpArray[i];}}

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(N)

        稳定性:不稳定


都看到这了,给个免费的赞呗,谢谢谢谢!!!

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

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

相关文章

elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮 el-select组件的visible-change 事件&#xff08;下拉框出现/隐藏时触发&#xff09; <el-selectref"select":value"value"placeholder"请选择"visible-change"visibleChange">&…

一天吃透Java集合面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

软考-访问控制技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分&#xff0c;用于控制用户或程序如…

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 Co…

Spring Boot 可以同时处理多少请求?

文章目录 Spring Boot 的请求处理能力1. 硬件资源2. 应用程序的设计3. 配置4. 运行时环境 基准测试和性能优化高性能的 Spring Boot 应用程序示例结论 &#x1f389;欢迎来到架构设计专栏~Spring Boot 可以同时处理多少请求&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#…

C语言实现面向对象编程 | 干货

前言 GOF的《设计模式》一书的副标题叫做“可复用面向对象软件的基础”&#xff0c;从标题就能看出面向对象是设计模式基本思想。 由于C语言并不是面向对象的语言&#xff0c;C语言没有直接提供封装、继承、组合、多态等面向对象的功能&#xff0c;但C语言有struct和函数指针。…

019-第三代软件开发-Git提交规范

第三代软件开发-Git提交规范 文章目录 第三代软件开发-Git提交规范项目介绍Git提交规范分支规范Commit Message FormatHeaderBodyFooterRevert 总结一下 关键字&#xff1a; Qt、 Qml、 git、 Commit、 release 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个…

【数据结构】优先级队列(堆)

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力…

java最新Springboot3+微服务实战12306高性能售票系统全套开发课程

java最新Springboot3微服务实战12306高性能售票系统全套开发课程 视频课程在文末获取 第1章 课程介绍与学习指南。 1-1 课前必读&#xff08;不读错过一个亿&#xff09; 1-2 课程导学 1-3 为什么要选择最新版本SpringBoot3和JDK17&#xff1f; 1-4 在线demo网站演示 第2…

谈谈 Redis 如何来实现分布式锁

谈谈 Redis 如何来实现分布式锁 基于 setnx 可以实现&#xff0c;但是不是可重入的。 基于 Hash 数据类型 Lua脚本 可以实现可重入的分布式锁。 获取锁的 Lua 脚本&#xff1a; 释放锁的 Lua 脚本&#xff1a; 但是还是存在分布式问题&#xff0c;比如说&#xff0c;一个客…

Java_Jdbc

目录 一.JDBC概述 二.JDBC API 三.ResultSet[结果集] 四.Statement 五.PreparedStatement 六. JDBC API 总结 一.JDBC概述 JDBC 为访问不同的数据库提供了同一的接口&#xff0c;为使用着屏蔽了细节问题Java程序员使用JDBC 可以连接任何提供了 JDBC驱动的数据库系统&am…

Linux考试复习整理

文章目录 Linux考试整理一.选择题1.用户的密码现象放置在哪个文件夹&#xff1f;2.删除文件或目录的命令是&#xff1f;3.显示一个文件最后几行的命令是&#xff1f;4.删除一个用户并同时删除用户的主目录5.Linux配置文件一般放在什么目录&#xff1f;6.某文件的组外成员的权限…

双指针——复写零

一&#xff0c;题目要求 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东…

Python Connect SQLServer 2008

Macos&#xff08;经过了两天&#xff0c;无数次的方法验证&#xff0c;寻找各种资料&#xff0c;总结如下&#xff09; brew install freetds0.91 如果出现错误就进行手工安装&#xff0c;也可以直接使用 brew install freetds安装最新版本&#xff08;测试通过&#xff09; …

Kerberos认证协议介绍

概述 官网&#xff1a;https://www.kerberos.org/ 官方文档&#xff1a;http://web.mit.edu/kerberos/krb5-current/doc/ 为TCP/IP网络系统设计的可信的第三方身份认证协议。网络上的Keberos服务基于DES对称加密算法&#xff0c;但也可以用其他算法替代。因此&#xff0c;Keb…

CSS 基础知识-01

CSS 基础知识 1.CSS概述2. CSS引入方式3. 选择器4.文字控制属性5. 复合选择器6. CSS 特性7.背景属性8.显示模式9.选择器10.盒子模型 1.CSS概述 2. CSS引入方式 3. 选择器 4.文字控制属性 5. 复合选择器 6. CSS 特性 7.背景属性 8.显示模式 9.选择器 <!DOCTYPE html> <…

(※)力扣刷题-栈和队列-用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empt…

【Java基础面试三十一】、String a = “abc“; ,说一下这个过程会创建什么,放在哪里?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;String a “abc”; &am…

Java集合类

Java集合类 集合类 集合类其实就是为了更好地组织、管理和操作我们的数据而存在的&#xff0c;包括列表、集合、队列、映射等数据结构。 集合根接口 Java中已经帮我们将常用的集合类型都实现好了&#xff0c;我们只需要直接拿来用就行了 所有的集合类最终都是实现自集合根…

【Javascript保姆级教程】运算符

文章目录 前言一、运算符是什么二、赋值运算符2.1 如何使用赋值运算符2.2 示例代码12.3 示例代码2 三、自增运算符3.1 运算符3.2 示例代码13.3 示例代码2 四、比较运算符4.1 常见的运算符4.2 如何使用4.3 示例代码14.4 示例代码2 五、逻辑运算符逻辑运算符列举 六、运算符优先级…