十大排序算法(Java)

article/2025/10/12 22:01:31

目录

1.冒泡排序

2.快速排序

3.插入排序

4.希尔排序

5.选择排序

6.堆排序

7.归并排序

8.计数排序:速度快,一般用于整数排序

9.桶排序

10.基数排序


1.冒泡排序

在这里插入图片描述

冒泡排序思路:(两层for循环)

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码:

​
public class Demo01 {public static void main(String[] args) {int[] arr=new int[]{1,5,7,4,8,9};Demo01.sort(arr);}public static void sort(int arr[]){for( int i = 0 ; i < arr.length - 1 ; i++ ) {for (int j = 0; j < arr.length - 1 - i; j++) {int temp = 0;if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println(Arrays.toString(arr));}}​

2.快速排序

首先选取一个基准数

快速排序思路:

  • 选取第一个数为基准
  • 将比基准小的数交换到前面,比基准大的数交换到后面
  • 对左右区间重复第二步,直到各区间只有一个数

代码:

public class Demo02 {public static void main(String[] args) {int[] arr=new int[]{1,5,3,6,7,4,8};Demo02.sort(arr,0,6);System.out.println(Arrays.toString(arr));}public static int potation(int[] nums,int low,int high){int point=nums[low];while(low<high){while(low < high &&nums[high]>=point) high--;nums[low]=nums[high];while(low < high &&nums[low]<=point) low++;nums[high]=nums[low];}nums[low]=point;return low;}public static void sort(int[] nums,int low,int high){if(low<high){int pivotpos=potation(nums,low,high);sort(nums,low,pivotpos-1);sort(nums,pivotpos+1,high);}}
}

3.插入排序

插入排序思路:

  • 从第一个元素开始,该元素可以认为已经被排序
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到该位置后
  • 重复步骤2~5

代码:

public static void sort(int[] arr) {int n = arr.length;for (int i = 1; i < n; ++i) {int value = arr[i];int j = 0;//插入的位置for (j = i-1; j >= 0; j--) {if (arr[j] > value) {arr[j+1] = arr[j];//移动数据} else {break;}}arr[j+1] = value; //插入数据}}

4.希尔排序

在这里插入图片描述

 

希尔排序思路:

  • 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
  • 希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。

代码:

public int[] shellSort(int[] A, int n) {//要插入的纸牌int temp,j,i;//设定增量D,增量D/2逐渐减小for(int D = n/2;D>=1;D=D/2){//从下标d开始,对d组进行插入排序for(j=D;j<n;j++){temp = A[j];for(i=j;i>=D&&A[i-D]>temp;i-=D){A[i]=A[i-D];}A[i]=temp;}}return A;}

5.选择排序

每次挑出最小的元素

代码:

public static void sort(int arr[]){for( int i = 0;i < arr.length ; i++ ){int min = i;//最小元素的下标for(int j = i + 1;j < arr.length ; j++ ){if(arr[j] < arr[min]){min = j;//找最小值}}//交换位置int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}

6.堆排序

代码:

public int[] heapSort(int[] A, int n) {//堆排序算法int i;//先把A[]数组构建成一个大顶堆。//从完全二叉树的最下层最右边的非终端结点开始构建。for(i=n/2-1;i>=0;i--){HeapAdjust(A,i,n);}//开始遍历for(i=n-1;i>0;i--){swap(A,0,i);//每交换一次得到一个最大值然后丢弃HeapAdjust(A,0,i);}return A;}//A[i]代表的是下标为i的根结点private void HeapAdjust(int[] A,int i,int n){int temp;temp = A[i];for(int j=2*i+1;j<n;j=j*2+1){if(j<n-1&&A[j]<A[j+1]){++j;}if(temp>=A[j]){break;}//将子节点赋值给根结点A[i] = A[j];//将子节点下标赋给ii = j;}//将存储的根结点的值赋给子节点A[i] = temp;}private void swap(int[] A,int i,int j){int temp = A[i];A[i]=A[j];A[j] = temp;}

7.归并排序

将其分成两路,每路再分两路,依次排序

8.计数排序:速度快,一般用于整数排序

计数排序步骤:

  • 找出待排序的数组中最大和最小的元素
  • 统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项
  • 对所有的计数累加(从 C中的第一个元素开始,每一项和前一项相加)
  • 反向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去1

代码:

public static void sort(int[] arr) {//找出数组中的最大值int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//初始化计数数组int[] countArr = new int[max + 1];//计数for (int i = 0; i < arr.length; i++) {countArr[arr[i]]++;arr[i] = 0;}//排序int index = 0;for (int i = 0; i < countArr.length; i++) {if (countArr[i] > 0) {arr[index++] = i;}}}

9.桶排序

类似于计数排序,将桶分好类,一定范围,再对桶内元素排序

public int[] countingSort(int[] A, int n) {if(A==null ||n<2){return A;}//找出桶的范围,即通过要排序的数组的最大最小值来确定桶范围int min=A[0];int max=A[0];for(int i=0;i<n;i++){min=Math.min(A[i],min);max=Math.max(A[i],max);}//确定桶数组,桶的下标即为需排序数组的值,桶的值为序排序数同一组值出现的次数int[] arr = new int[max-min+1];//往桶里分配元素for(int i=0;i<n;i++){arr[A[i]-min]++;}//从桶中取出元素int index=0;for(int i=0;i<arr.length;i++){while(arr[i]-->0){A[index++]=i+min;}}return A;}

10.基数排序

基数排序步骤:

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

这篇文章对排序解释我认为比较清楚:https://blog.csdn.net/amazing7/article/details/51603682


http://chatgpt.dhexx.cn/article/t9nEP1pa.shtml

相关文章

十大排序算法(C++)

十大排序算法Sorting algorithm(C) 百度百科&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地…

十大排序算法——C语言实现

1.冒泡排序 ​ 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数…

Python实现十大排序算法

1.排序算法概述 非线性时间比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此称为非线性时间比较类排序。 线性时间非比较类排序&#xff1a;不通过比较来决定元素间的相对次序&#xff0c;它可以突破基于比…

Java实现十大排序算法

Java实现十大排序算法 十大排序算法分别为&#xff1a;选择排序、冒泡排序、插入排序、快速排序、归并排序、堆排序、希尔排序、桶排序、计数排序、基数排序。 本篇只是为了方便我在代码中直接复制调用&#xff0c;因此原理和思想解释的并不清楚&#xff0c;想看原理的朋友可…

十大排序算法(C++版)

十大排序算法 前言一、插入排序二、希尔排序三、冒泡排序四、快速排序五、选择排序六、归并排序七、堆排序八、计数排序九、桶排序十、基数排序总结 前言 什么是排序&#xff1f; 排序&#xff1a;将一组杂乱无章的数据按一定规律顺次排列起来。即&#xff0c;将无序序列排成一…

十大排序算法详解

十大排序算法详解 参考程序员必知必会的十大排序算法详解 引言 对于排序的分类&#xff0c;可以将排序算法分为两大类&#xff1a;基于比较和非比较的算法。 基于比较的排序算法可以细分为&#xff1a; 基于交换类&#xff1a;冒泡排序、快速排序基于插入类&#xff1a;直接插入…

JS 实现十大排序算法

文章目录 前言零、十大排序一、冒泡排序&#xff08;bubbleSort&#xff09;二、选择排序&#xff08;selectionSort&#xff09;三、插入排序&#xff08;insertSort&#xff09;四、希尔排序&#xff08;shellSort&#xff09;五、归并排序&#xff08;mergeSort&#xff09;…

十大经典排序算法Java版(动图演示)

文章目录 0 排序算法说明0.1 内部排序和外部排序0.2 比较类排序和非比较类排序0.3 关于时间复杂度0.4 关于稳定性0.5 名词解释&#xff1a; 1 交换排序——冒泡排序&#xff08;Bubble Sort&#xff09;1.1 什么时候最快1.2 什么时候最慢1.3 算法步骤1.4 动图演示1.5 Java实现 …

html之如何让button按钮居中

解决措施&#xff1a;使用center或者div的align属性 示例代码&#xff1a; <html> <body><center><button onClick"clickme()">hit me</button></center><script>function clickme(){alert("123");} </scr…

HTML中让表单和提交按钮居中的方法

表单&#xff1a; form{ width: 500px; /*设置宽度&#xff0c;方便使其居中*/ margin: 40px auto auto auto; /*上右下左*/ font-size: 25px; 提交按钮&#xff1a;div的align属性 <div align"center"><button onClick"clickme()">提交…

android中的Button按钮居中(水平垂直中)

今天发现一个很怪异的事 Android Studio中居然一个简单的按钮水品垂直居中都写不出来 下图为理想效果&#xff1a; 可是当我写原始出代码的时候&#xff08;如下&#xff09;&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…

Vue组件居中:文字居中,按钮居中,图片居中等,如何实现在容器中居中

Vue实现组件在容器中居中显示的办法 本文用实验的方法理解各种方法实现居中的效果。 实现水平居中的样式主要有&#xff1a;text-align: center&#xff0c; margin: auto。 当然还有别的方式也可以实现&#xff0c;也会写在下面。 用三个同样的div来控制变量法看效果&#xf…

Contact form 7 提交按钮居中,怎么设置submit button居中显示

Contact form 7 提交按钮居中&#xff0c;怎么设置submit button居中显示 前言 最近公司在做网站&#xff0c;毫无疑问用的是wordpress程序&#xff0c;然后就用到了contact form 7这个插件。单是这个插件的按钮始终无法居中显示&#xff0c;查了很多教程有的让改主题&#x…

tkinter 让按钮居中显示

def ask(self, title, text, btn_comfirm_name"确定", btn_cancel_name"取消", wraplength400):self.master.title(title)tk.Label(self.middle, texttext, bg"#ffffff", wraplengthwraplength,justify"left").pack(pady15)self.botto…

html表单中按钮居中,Ant design StepsForm中如何使底部按钮居中

如图所示,当前有一个StepsForm表单,代码如下(基本就是官网的示例修改的)const Demo: React.FC = () => {const Option = [ {key: 1, value: 111, label: 个人 }, {key: 2, value: 222, label: 合作 }, ] const waitTime = (time: number = 100) => {return new Promise…

layui使按钮居中_button按钮居中的方法

今天在写页面时&#xff0c;发现给button按钮设置居中时&#xff0c;css页面写了text-align"center"&#xff0c;但是不起作用&#xff0c;用了display属性也无作用&#xff0c;试了好多次发现要给button按钮添加个p&#xff0c;然后让p居中就可以了。以下写个test来…

Android IMS 语音通话 vs 视频通话 vs 视频彩铃

背景 以下内容基于Android P code。 主要差异 视频通话比语音通话主要是多了判断是否为视频通话&#xff0c;及视频的显示和传输。如下&#xff1a; video call 视频界面显示控制 界面通过IVideoProvider控制camera的显示并设置TextureView等&#xff0c;Ims service通过IV…

Unity 语音和视频通话快速解决方案——声网 SDK接入指南(Android)

Unity 语音和视频通话快速解决方案——声网 SDK接入指南&#xff08;Android&#xff09; 文章目录 Unity 语音和视频通话快速解决方案——声网 SDK接入指南&#xff08;Android&#xff09;一、前言二、后台创建应用三、获取 SDK四、接入 Agora Voice 语音 SDK1. 导入工程2. 搭…

技术分享| 小程序实现音视频通话

上一期我们把前期准备工作做完了&#xff0c;这一期就带大家实现音视频通话&#xff01; sdk 二次封装 为了更好的区分功能&#xff0c;我分成了六个 js 文件 config.js 音视频与呼叫邀请配置 store.js 实现音视频通话的变量 rtc.js 音视频逻辑封装 live-code.js 微信推拉…

快速开放,推荐一个视频通话sdk agora

1&#xff0c;agora 推荐一个做实时视频的sdk。 做互联网公司&#xff0c;要快速做出自己的稳定的产品。 视频&#xff0c;语音聊天还是有一定的门槛的。 http://cn.agora.io/ 做互联网的要的就是要快速 2&#xff0c;每个月还有免费的流量 上线后每月10000分钟免费。这个…