数据结构排序方法总结

给定两个数组A,B,将A,B排序合并成一个数组,输出升序排列后的新数组。数组A,B中为整数,字母。

下面是代码:

import java.util.Arrays;public class Solution15 {//冒泡排序public static void bubbleSort(String[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (array[j].compareTo(array[j + 1]) > 0) {// 交换元素String temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}public static void main(String[] args) {String[] A = {"d", "3", "a", "5"};String[] B = {"b", "4", "1", "c"};String[] mergedArray = mergeArrays(A, B);bubbleSort(mergedArray);System.out.println(Arrays.toString(mergedArray));}private static String[] mergeArrays(String[] A, String[] B) {String[] result = new String[A.length + B.length];// arraycopy主要定义是源数组 起始点,复制长度,目标起点,复制长度System.arraycopy(A, 0, result, 0, A.length);System.arraycopy(B, 0, result, A.length, B.length);return result;}//快排public static void quickSort(String[] array, int low, int high) {if (low < high) {int pi = partition(array, low, high);quickSort(array, low, pi - 1);quickSort(array, pi + 1, high);}}private static int partition(String[] array, int low, int high) {String pivot = array[high];int i = (low - 1);for (int j = low; j < high; j++) {if (array[j].compareTo(pivot) < 0) {i++;// 交换元素String temp = array[i];array[i] = array[j];array[j] = temp;}}// 交换元素String temp = array[i + 1];array[i + 1] = array[high];array[high] = temp;return i + 1;}//堆排public static void heapSort(String[] array) {int n = array.length;// 构建堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(array, n, i);}// 提取元素for (int i = n - 1; i > 0; i--) {// 交换元素String temp = array[0];array[0] = array[i];array[i] = temp;heapify(array, i, 0);}}private static void heapify(String[] array, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && array[left].compareTo(array[largest]) > 0) {largest = left;}if (right < n && array[right].compareTo(array[largest]) > 0) {largest = right;}if (largest != i) {// 交换元素String swap = array[i];array[i] = array[largest];array[largest] = swap;heapify(array, n, largest);}}// 希尔排序public static void shellSort(String[] array) {int n = array.length;for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; i++) {String temp = array[i];int j;for (j = i; j >= gap && array[j - gap].compareTo(temp) > 0; j -= gap) {array[j] = array[j - gap];}array[j] = temp;}}}//插入排序public static void insertionSort(String[] array) {int n = array.length;for (int i = 1; i < n; i++) {String key = array[i];int j = i - 1;while (j >= 0 && array[j].compareTo(key) > 0) {array[j + 1] = array[j];j = j - 1;}array[j + 1] = key;}}// 选择排序public static void selectionSort(String[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j].compareTo(array[minIndex]) < 0) {minIndex = j;}}// 交换元素String temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}}

这里我们说下因为基数排序大多用在整数排序,所以这里不列出来。

1.直接插入排序的思想是指:每次将一个待排序的元素按大小插入到前面己排好序的有序表中,直到全部元素排序完成。最开始默认当前有序表的第0个元素成为一个已经排序好的有序的子数组 直接插入排序的时间复杂度为O( n2 ) 

2.希尔排序( Shell’s Sort)又称“缩小增量排序”( Diminishing Increment Sort),是插入排序的一种, 因D.L.Shell 于1959 年提出而得名。直接插人排序,当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。希尔排序基于以上两点,从“减少记录个数”和“序列基本有序”两个方面对直接插入排序进行了改进。

基本思想:
先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

希尔排序特点:
(1)缩小增量
(2)多遍插入排序

3.直接选择排序
概念:直接选择排序又称简单选择排序,是一种不稳定的排序方法,其是选择排序中最简单一种,其基本思想是:第 i 趟排序再待排序序列 a[i]~a[n] 中选取关键码最小的记录,并和第 i 个记录交换作为有序序列的第 i 个记录。
其实现利用双重循环,外层 i 控制当前序列最小值存放的数组元素位置,内层循环 j 控制从 i+1 到 n 序列中选择最小的元素所在位置 k

具体的排序过程为:

1.将整个记录序列划分为有序区和无序区,初始时有序区为空,无序区含有待排序的所有记录
2.在无序区选择关键码最小的记录,将其与无序区中的第一个元素,使得有序区扩展一个记录,同时无序区减少了一个记录
3.不断重复步骤 2,直到无序区只剩下一个记录为止

4.堆排序
基本思想:

1.首先将待排序的数组构造成一个大堆,此时,整个数组的最大值就是堆结构的顶端

2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

3.将剩余的n-1个数再构造成大堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组

构造堆
将无序数组构造成一个大根堆(升序用大根堆,降序就用小根堆)

每次新插入的数据都与其父结点进行比较,如果插入的数比父结点大,则与父结点交换,否则一直向上交换,直到小于等于父结点,或者来到了顶端

固定最大值再构造堆。

5.冒泡排序
冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。
冒泡排序的步骤是比较固定的:
①比较相邻的元素。如果第一个比第二个大,就交换他们两个。
②每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。
③针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较

6.快速排序

也是一种较为基础的排序算法,其效率比冒泡排序算法有大幅提升。因为使用冒泡排序时,一趟只能选出一个最值,有n个元素最多就要执行n - 1趟比较。而使用快速排序时,一次可以将所有元素按大小分成两堆,也就是平均情况下需要logn轮就可以完成排序。

快速排序的思想是:
每趟排序时选出一个基准值,然后将所有元素与该基准值比较,并按大小分成左右两堆,然后递归执行该过程,直到所有元素都完成排序。

快速排序的步骤如下:
①先从数列中取出一个数作为基准数。
②分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
③再对左右区间重复第二步,直到各区间只有一个数

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

俄罗斯Ozon选品三要素,简单实用的选品方法

在 Ozon 上选品可以参考以下三个要素&#xff1a; 要素一&#xff1a;市场需求 关注热门品类&#xff1a;从 Ozon 的销售数据和市场趋势来看&#xff0c;像电子产品&#xff08;如手机、耳机、智能穿戴设备等&#xff09;、时尚服饰&#xff08;包括流行服装、鞋类、配饰&…

电商数据驱动决策:京东商品详情API返回值的力量

在电商数据驱动决策的过程中&#xff0c;京东商品详情API返回值的力量不容忽视。这些返回值包含了丰富的商品信息&#xff0c;如商品标题、价格、图片、规格参数、用户评价等&#xff0c;为电商企业提供了强大的数据支持&#xff0c;帮助企业更加精准地把握市场动态&#xff0c…

开源项目|聚合支付工具,封装了某宝、某东、某银、PayPal等常用的支付方式

前言 IJPay是一款开源的支付SDK&#xff0c;它集成了微支付、某宝支付、银联支付等多种支付方式&#xff0c;为开发者提供了一种简单、高效的方式来处理支付问题。以下是IJPay的一些主要特点&#xff1a; 支持多种支付方式&#xff1a;IJPay支持微信支付、支付宝支付、银联支付…

用Python实现时间序列模型实战——Day 10: ARIMA 与 SARIMA 模型的综合练习

一、学习内容 1. ARIMA 与 SARIMA 模型的对比分析 ARIMA 模型&#xff1a; ARIMA 模型适用于没有明显季节性趋势的时间序列数据。它通过自回归 (AR)、差分 (I) 和移动平均 (MA) 成分来建模时间序列数据的趋势和噪声。 SARIMA 模型&#xff1a; SARIMA 模型是 ARIMA 模型的…

基于TensorFlow框架的手写数字识别系统(代码+论文+开题报告等)

手写数字识别 需安装Python3.X 64bit相关版本、Tensorflow 1.x相关版本 IDE建议使用Pycharm 打开main.py&#xff0c;运行即可 1.4 研究方法 实验研究表明&#xff0c;若手写体数字没有限制&#xff0c;几乎可以肯定没有一劳永逸的方法能同时达到90%以上的识别率和较快的识别…

网银U盾:财务眼中钉,会计肉中刺!

随着网银U盾的广泛应用&#xff0c;虽然使得财务安全有了大幅提升&#xff0c;但企业财务管理效率却越来越低了。 近期&#xff0c;我们发现&#xff0c;高达85%的企业在采购我们的USB Server时&#xff0c;都是出于网银U盾反复插拔的繁琐、效率低下、管理困难等原因。 想象一…

使用COAP和MQTT协议的多协议方法开发的用于机器人手术的自动医疗物联网系统

这篇论文的标题是《Development of automatic medical internet of things system (MIoT) for robotic surgery with multi-protocol approach using COAP and MQTT protocols》&#xff0c;作者是 Sujit N. Deshpande 和 Rashmi M. Jogdand&#xff0c;发表在《International …

浏览器百科:网页存储篇-Local storage介绍(四)

1.引言 在前面的章节中&#xff0c;我们详细介绍了 Cookie 的概念和应用实例。随着网页应用的不断发展&#xff0c;数据存储需求越来越多样化&#xff0c;浏览器提供了多种存储机制来满足这些需求。其中&#xff0c;localStorage 作为一种重要的网页存储方式&#xff0c;可以在…

前端bug:v-show嵌套组件外层,页面扩大后,组件被遮挡

在外层套上v-show 页面扩大到125%后&#xff0c;页码栏被压缩到窗口底部&#xff0c;被遮挡了 把v-show放到每个内部组件上 解决了被遮挡的问题 虽然问题解决了&#xff0c;但是不清楚原理是什么&#xff0c;麻烦路过的大佬指点一下&#xff0c;感谢&#xff01;&#x…

Mac+Pycharm配置PyQt6教程

安装包 pip install PyQt6 PyQt6-tools #查看Qt版本 pip show PyQt6 pip show pyqt6-tools 配置扩展工具 QTD(界面设计) Program&#xff1a;/Users/wan/PycharmProjects/NewDemo/venv/lib/python3.11/site-packages/qt6_applications/Qt/bin/Designer.app Working directo…

JavaScript Web API入门day5

目录 1.Window对象 1.1 BOM(浏览器对象模型) 1.2 定时器-延时函数 1.3 JS执行机制 1.3.1 问题 1.3.2 解决问题 1.4 location对象 1.5 navigator对象 1.6 histroy对象 2.本地存储 2.1 本地存储介绍 2.2 本地存储分类 2.2.1 本地存储分类 - localStorage 2.2.2 本地…

【生日视频制作】白色卡车行万里路车身改字2版AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程白色卡车行万里路车身改字2版AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】白色卡车行万里路车身改字2版AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把…

Nature Communications 单细胞算法 scDist,教你怎么找到重要的细胞亚群与基因!

生信碱移 scDist: 寻找关键细胞亚群与基因的方法 单细胞RNA测序&#xff08;scRNA-seq&#xff09;使我们能够研究受药物治疗、感染以及癌症等疾病中关键的细胞亚群。为了找到可能影响疾病的细胞亚群乃至基因&#xff0c;我们常常去比较两个或多个组之间显著差异的细胞类型。…

docker安装prometheus、grafana监控SpringBoot

1. 概述 最新有一个需求&#xff0c; 需要安装一个监控软件&#xff0c;对SpringBoot程序进行监控&#xff0c; 包括机器上cpu, 内存&#xff0c;jvm以及一些日志的统计。 这里需要介绍两款软件&#xff1a; prometheus 和 grafana prometheus: 中文名称&#xff0c; 普罗米…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

遥控器显示分别对应的无人机状态详解!!

1. 电量显示 遥控器电量&#xff1a;遥控器上通常会显示自身的电池电量&#xff0c;以提醒用户及时充电。 无人机电量&#xff1a;部分高端遥控器还会显示无人机的电池电量&#xff0c;以进度条或百分比的形式表示&#xff0c;帮助用户了解无人机的续航能力。 2. 飞行模式与…

【C语言从不挂科到高绩点】09-作业练习-循环结构02

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程,前面课程中给大家讲解了一些常规的知识点,那么本次课,我们一起来练习挑战一下!! 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同…

【C++题解】1002 - 编程求解1+2+3+...+n

问题一&#xff1a;1002 - 编程求解123…n 类型&#xff1a;简单循环 题目描述&#xff1a; 编程求解下列式子的值&#xff1a; S123⋯n。 输入&#xff1a; 输入一行&#xff0c;只有一个整数 n(1≤n≤1000) 。 输出&#xff1a; 输出只有一行&#xff08;这意味着末尾有…

R语言 | 文件读取

一、文件读取 -scan()函数 scan(file “”, what double(), nmax -1, n -1, sep “ ”)&#xff0c;file" " 的双引号里写文件地址&#xff0c;what写读入的数据类型&#xff0c;如果文件有好几种类型&#xff0c;可以啥也不写&#xff08;what" "&…

如何解决Vue中给data中的对象属性添加一个新的属性时响应式不生效的问题?

vue2的响应式原理使用的是对象代理去实现的&#xff0c;对象代理中有一个get和set方法&#xff0c;当我们访问对象的时候就会触发get方法&#xff0c;当我们对对象中的值进行修改时会触发set方法。但是当我们给对象添加一个新的属性时对象代理是检测不到的&#xff0c;所以就会…