java中常见的几种排序

常见的几种排序整理

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 希尔排序
  • 快速排序
  • 归并排序
  • 堆排序

冒泡排序

思想:对比当前值的下一个值,如果大就交换位置
代码:

/*** 冒泡排序*/
public class bubbleSort {public static void main(String[] args) {int[] array = {1, 5, 3, 2, 4};bubbleSort(array);System.out.println(Arrays.toString(array));}public static void bubbleSort(int[] array) {for (int i = 0; i < array.length; i++) {for (int j = i + 1; j < array.length; j++) {if (array[i] > array[j]) {int temp = array[j];array[j] = array[i];array[i] = temp;}}}}
}

选择排序

思想:选择当前数组中最小的一个值放在起始位置,再从剩下的数组值中选择第二小的值放在前面值的后面,直到选完。
代码:

/*** 选择排序*/
public class SelectSort {public static void main(String[] args) {int[] array = {1, 5, 3, 2, 4};selectSort(array);System.out.println(Arrays.toString(array));}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[minIndex] > array[j]) {minIndex = j;}}int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}
}

插入排序

思想:

  1. 首先从第一个元素开始,该元素被认为是有序的;
  2. 取出下一个元素,在已经排序的元素序列中从后往前进行扫描;
  3. 如果该已排好序的元素大于新元素,则将该元素移到下一位置;
  4. 重复步骤3一直往前进行扫描比较,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

代码:

public class InsertSort {public static void main(String[] args) {int[] array = {1, 5, 3, 2, 4};insertSort(array);System.out.println(Arrays.toString(array));}public static void insertSort(int[] a) {for (int i = 1; i < a.length; i++) {int j = i - 1;int current = a[i];while (a[j] > current && j > 0) {a[j + 1] = a[j];j--;}a[j + 1] = current;}}
}

希尔排序

思想:更加高效的排序,是插入排序的升级版,总的来说就是先分组做插入排序,最后当gap为1时,再对整个数组进行一次插入排序,这时候数组基本有序,所以最后一次插入排序耗时很低。
在这里插入图片描述
代码:

public class ShellSort {public static void main(String[] args) {int[] array = {1, 5, 3, 2, 4};shellSort(array);System.out.println(Arrays.toString(array));}public static void shellSort(int[] a) {int len = a.length;int temp;int j;for (int gap = len / 2; gap >= 1; gap = gap / 2) {for (int i = gap; i < len; i++) {temp = a[i];j = i - gap;while (j > 0 && a[j] > temp) {a[j + gap] = a[j];j -= gap;}a[j + gap] = temp;}}}
}

快速排序

思想: 选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

public class QuickSort {public static void main(String[] args) {int[] arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int low, int high) {if (low < high) {// pi 是分区索引,arr[p] 现在已经到位int pi = partition(arr, low, high);// 分别对 pi 左边和右边的子数组进行递归排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}// 这个函数将数组分为两部分,并返回分区索引public static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 选择最右边的元素作为主元int i = (low - 1); // 指向最小元素的指针for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于主元if (arr[j] <= pivot) {i++;// 交换 arr[i] 和 arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换 arr[i+1] 和 arr[high] (或主元)int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}
}

归并排序

思想:采用分治法,从中间拆分为2个子组,然后递归拆分子组直到每个子组数量为1,不断的将相邻两个子组合并并且排序直到只剩一个组
代码:

public class mergeSortTest {public static void main(String[] args) {int[] array = {1, 5, 3, 2, 4};mergeSort(array);System.out.println(Arrays.toString(array));}public static void mergeSort(int[] array) {if (array == null || array.length == 1) {return;}mergeSort(array, 0, array.length - 1);}public static void mergeSort(int[] array, int left, int right) {if (left < right) {int mid = (left + right) / 2;// 对左半部分进行归并排序mergeSort(array, left, mid);// 对右半部分进行归并排序mergeSort(array, mid + 1, right);// 合并两个有序数组merge(array, left, mid, right);}}//合并左右两侧子数组public static void merge(int[] array, int left, int mid, int right) {//临时数组int[] temp = new int[right - left + 1];//左边指针int p1 = left;//右侧指针int p2 = mid + 1;//临时数组下标int tempIndex = 0;//此步就是合并左右两边,然后比大小,排序while (p1 <= mid && p2 <= right) {temp[tempIndex++] = array[p1] < array[p2] ? array[p1++] : array[p2++];}while (p1 <= mid) {temp[tempIndex++] = array[p1++];}while (p2 <= right) {temp[tempIndex++] = array[p2++];}//将临时数组的元素复制回原数组if (tempIndex >= 0) System.arraycopy(temp, 0, array, left, tempIndex);}
}

堆排序

思想:
堆排序是一种基于二叉堆(通常是大顶堆或小顶堆)的比较排序算法。其基本思想是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个序列重新构造成一个堆,这样会得到n个元素中的次大值。 如此反复执行,便能得到一个有序序列了。
代码:

public class HeapSort {public static void main(String[] args) {int[] arr = {10, 7, 8, 9, 1, 5, 3, 5, 5, 2, 0, 6, 0, 9};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int arr[]) {int n = arr.length;// 构建最大堆(从最后一个非叶子节点开始)for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 一个一个从堆顶取出元素,将堆顶元素沉到数组末端for (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;// 重新调整堆  heapify(arr, i, 0);}}// 调整堆/*** 调整堆* 关键解释:* 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]* 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]*/static void heapify(int arr[], int n, int i) {int largest = i; // 初始化最大值为根  int left = 2 * i + 1; // 左 = 2*i + 1int right = 2 * i + 2; // 右 = 2*i + 2// 如果左子节点大于根  if (left < n && arr[left] > arr[largest])largest = left;// 如果右子节点大于目前已知的最大值  if (right < n && arr[right] > arr[largest])largest = right;// 如果最大值不是根  if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;// 递归调整受影响的子堆  heapify(arr, n, largest);}}
}

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

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

相关文章

【域适应】深度域适应常用的距离度量函数实现

关于 深度域适应中&#xff0c;有一类方法是实现目标域和源域的特征对齐&#xff0c;特征对齐的衡量函数主要包括MMD&#xff0c;MK-MMD&#xff0c;A-distance&#xff0c;CORAL loss&#xff0c; Wasserstein distance等等。本文总结了常用的特征变换对齐的函数定义。 工具 …

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…

OpenHarmony南向开发案例:【智能保险柜】

样例简介 智能保险柜实时监测保险柜中振动传感器&#xff0c;当有振动产生时及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程接收智能保险柜的报警信息。后续可扩展摄像头等设备&#xff0c;实现对危险及时报警&#xff0c;及时处理&a…

探究 ChatGPT 的心脏--Transformer(基础知识第一篇)

Transformer 是 ChatGPT 的核心部分&#xff0c;如果将 AI 看做一辆高速运转的汽车&#xff0c;那么 Transformer 就是最重要的引擎。它是谷歌于 2017 年发表的《Attention is All You Need》中提出的 Sequence-to-sequence 的模型&#xff0c;诞生之后便一统江湖&#xff0c;在…

项目存放在git上,在jenkins使用docker打包并推送到Ubuntu上运行

项目添加dockerfile 在需要打包的工程的根目录添加Dockerfile文件&#xff0c;文件内容&#xff1a; # 设置JAVA版本 FROM openjdk:8 # 指定存储卷&#xff0c;任何向/tmp写入的信息都不会记录到容器存储层 VOLUME /tmp# 拷贝运行JAR包 ARG JAR_FILE COPY ${JAR_FILE} app.jar…

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个数如果从左往右读和从右往左读数字是完全相同的&#xff0c;则称这个数为回文数&#xff0c;比如898,1221,15651都是回文数。编写…

内核驱动更新

1.声明我们是开源的 .c 文件末尾加上 2.在Kconfig里面修改设备&#xff0c;bool&#xff08;双态&#xff09;-----》tristate&#xff08;三态&#xff09; 3.进入menuconfig修改为M 4.编译内核 make modules 也许你会看到一个 .ko 文件 5.复制到根目录文件下 在板子…

4.11作业

服务器端 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器端类 #include<QMessageBox> //消息对话框 #include<QTcpSocket> //客户端类 #include<QList> //链表容器QT_BEGIN_NAMESPACE namespace Ui { cla…

Pycharm远程连接服务器配置详解

背景&#xff1a; 相信很多人都遇到了这种情况&#xff0c;日常的开发和程序的验证都需要在linux环境下验证&#xff0c;而我们都是使用本地windows来进行开发或者脚本的编写&#xff0c;然后再push到远程仓库&#xff0c;再到linux环境下pull下来代码验证&#xff0c;这样每次…

CorelDRAW21.2.4中文最新官方和谐版下载

CorelDRAW是一款由加拿大Corel公司出品的平面设计软件&#xff0c;也被称为CDR。它是一款功能强大的矢量图形制作和排版软件&#xff0c;主要面向绘图设计师和印刷输出人员。该软件提供了矢量插图、页面布局、图片编辑和设计工具&#xff0c;广泛应用于排版印刷、矢量图形编辑及…

HWOD:密码强度等级

一、知识点 回车键的ASCII码是10 如果使用EOF&#xff0c;有些用例不通过 二、题目 1、描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二、字母: 0…

NotePad++ 快速生成SQL IN (‘’,‘’)

sql In(‘’&#xff0c;‘’)这种形式 第一步&#xff1a;AltC 鼠标放在第一行最左边 第二步 CtrlH $代表行末 第三步 去掉每行换行符 换行可能是"\n" 或者"\r"或者"\r\n" 结果&#xff1a;

容错组合导航

在初始值正确的情况下&#xff0c;惯性导航短期精度较高&#xff0c;但是其误差随着时间是累计的。如果要提高惯性导航的长期精度&#xff0c;就必须提高惯性器件的精度和初始读准精度&#xff0c;这必将大大提高成本。 如果将惯性导航与其他导航系统适当地组合起来&#xff0c…

Java泛型中 T 和 ? 傻傻分不清楚

1.定义&#xff1a; JDK5.0后&#xff0c;Java提供了泛型。 泛型是一种在编译时提供类型安全的方式&#xff0c;允许程序员在定义类、接口和方法时使用类型参数。这样&#xff0c;可以在不损失类型安全的情况下&#xff0c;创建可重用的代码。 泛型有两种主要的使用形式&#x…

linux学习:栈

目录 顺序栈 结构 初始化一个空顺序栈 压栈 出栈 例子 十进制转八进制 链式栈 管理结构体的定义 初始化 压栈 出栈 顺序栈 顺序栈的实现&#xff0c;主要就是定义一块连续的内存来存放这些栈元素&#xff0c;同时为了方便管理&#xff0c; 再定义一个整数变量来代表…

2024中国(宁波)国际宠物用品博览会

2024中国(宁波)国际宠物用品博览会 People&Pet Fair 2024 专注2B交易&#xff0c;关注人宠发展&#xff0c;它经济&#xff0c;势不可挡! 时间&#xff1a;2024年11月14-16日 地点&#xff1a;宁波国际会展中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; …

水离子雾化壁炉与酒店大厅的氛围搭配

将水离子雾化壁炉与酒店大厅的氛围搭配是一个很好的主意&#xff0c;可以为大厅增添舒适、温馨的氛围&#xff0c;以下是一些建议&#xff1a; 迎宾区域&#xff1a;在酒店大厅的迎宾区域设置水离子雾化壁炉&#xff0c;作为客人抵达时的第一印象。壁炉的温馨效果可以让客人感到…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求&#xff0c;在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…