java十大排序算法

article/2025/10/13 2:12:34

十大排序算法在面试java过程中想必或多或少都会有。尤其是在笔试题上,有些大厂就让你现场写个十大排序。是不是一下子整懵了。。。

目录

一、首先先介绍下十大排序算法:

1、算法分类

2 、算法复杂度

3、 相关概念

二、详细分析各个算法

1、冒泡排序

2、选择排序

3、快速排序

4、插入排序

5、计数排序

6、希尔排序

7、堆排序

8、归并排序

9、桶排序

10、基数排序


一、首先先介绍下十大排序算法:

1、算法分类

十种常见排序算法可以分为两大类:

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 

2 、算法复杂度

3、 相关概念

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
  • 算法的时间与空间复杂度(一看就懂) - 知乎

二、详细分析各个算法

1、冒泡排序

算法思路

  • 比较相邻的元素,如果第一个比第二个大,就交换他们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一轮比较完最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。

 代码实现过程:

public static int[] sort(int[] a) {for (int i = 1; i < a.length; i++) {           //外循环为比较几趟for (int j = 0; j < a.length - i; j++) {   if (a[j] > a[j + 1]) {int temp = a[j + 1];a[j + 1] = a[j];a[j] = temp;}}}return a;
}

算法稳定性:

如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定;冒泡排序是稳定的排序算法。

时间复杂度:

对于n位的数列则有比较次数为(n-1)+(n+2)+ . . . + 1 = n * (n-1) / 2,这就得到了最大的比较次数,n(n-1)/2 = (n^{2}-n) / 2,计算时间复杂度的时候,忽略常数项1/2,在忽略低阶项n,得到冒泡排序的时间复杂度为O(n^{2})

2、选择排序

选择排序是一种简单直观的排序算法。

算法思路:

以由小到大排序为例,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

 第一轮:找到最小值23,跟第1个位置29交换,得到有序集合{23}。

 第二轮:从无序集合中找到最小值27,跟第2个位置38交换,得到有序集合{23,27}。

以此类推,总共比较n-1趟。

代码实现:

public static void chooseSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {        //无序集合中的第一个只要比后面的某个数大就交换int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}
}

算法稳定性:

选择排序时不稳定的算法。例如序列“5(1) ,8 ,5(2) ,2 ,9”,5(1)会和2交换,相对位置在5(2)的后面了,所以破坏稳定性。

时间复杂度:

  • n-1
  • n-2
  • n-3
  • n-4
  • n-1:1  比较次数:(n-1+1)(n-1)/2=(n^2-n)/2   时间复杂度=O(n^{2})

3、快速排序

快速排序(Quicksort)是对冒泡排序算法的一种改进。

算法思路:

快速排序算法的排序流程如下:

  • 先从数列中取出一个数作为基准数。
  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 再对左右区间重复第二步,直到各区间只有一个数。(递归)

 经过第一趟排序,数组被划分为两个区,5左边是小于5的{2,3,0,1,4},5右边是大于5的{6,7,9,10,8}。我们在分别对这两个区进行递归操作,直至每个组只剩下1个数字,排序完成!

代码实现:

public static void quickSort(int[] a, int low, int high) {if (low >= high) {return;}int i = low;int j = high;int base = a[i];while (i < j) {//先进行从后往前比较,比基准值小的交换,否则一直往前找比基准值小的while (a[j] >= base && i < j) {j--;}int temp = a[i];a[i] = a[j];a[j] = temp;//从前往后比较,找比基准值大的交换,否则一直往后找while (a[i] <= base && i < j) {i++;}temp = a[i];a[i] = a[j];a[j] = temp;}//当i=j时,就以i或者j下标的元素看成分界线,这时左边比这个分界线的数小,右边比这个分界线的值大。然后再对这两个区进行递归,直到每个组只剩一个数quickSort(a, low, i - 1);   //分界线左边进行排序quickSort(a, i + 1, high);  //分界线后边进行排序
}

排序稳定性:

快速排序排序是不稳定的排序算法。

时间复杂度: 

4、插入排序

插入排序时一种简单直观的排序算法。

算法思路:

把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

第一轮:从第二个位置的2开始比较,比前面5小,交换位置。

第二轮:这时有序表为2和5,无序表为4、6、1、3,然后继续无序表中的第一个数在有序表中从后往前比较,直到比它大才停止比较。以此类推。。。

代码实现:

public static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {  //比较的趟数for (int j = i; j > 0; j--) {       if (arr[j] < arr[j - 1]) {      //找如果比有序表中的数小就交换,否则停止插入int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;} else {break;}}}
}

算法稳定性:

插入排序是稳定的排序算法。

时间复杂度:

O(n^2)

5、计数排序

计数排序是一种非比较排序算法,其核心在于将输入的数据值转换为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计数排序需要输入的数据必须是有确定范围的整数。

    原始序列为:5 ,3 ,5 ,8 ,2 ,10

 代码实现:

public static void countSort(int[] arr) {//找出最大的数maxint max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//找出最小的数minint min = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] < min) {min = arr[i];}}//创建计数数组int[] count = new int[max + 1];//遍历arrfor (int i = 0; i < arr.length; i++) {count[arr[i]]++;}//遍历输出计数数组int k = 0;for (int i = 0; i < count.length; i++) {while (count[i] > 0) {arr[k++] = i;count[i]--;}}
}

代码优化:

我们考虑一个问题,如果数组是[101,103,110,116,,119,120],如果开辟了一个121大小的数组,前100个位置都是空的,显然是不合适的,因此我们可以把数组的大小设置成max-min+1。这时,我们向数组中计数时,下标要减去一个偏移量min,输出数组的时候,要加上这个偏移量。

算法稳定性:

计数排序是一个稳定排序算法。

时间复杂度:

时间复杂度是O(n+k),其中n是数组长度,k是数据的范围,因为将n个数放入计数数组的时间复杂度是O(n),从长度为k的计数数组中输出元素的时间复杂度为O(k),所以总的时间复杂度为O(n+k).

6、希尔排序

7、堆排序

8、归并排序

9、桶排序

10、基数排序


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

相关文章

Go语言十大排序算法

文章目录 Go语言十大排序算法0x01 冒泡排序0x02 选择排序0x03 插入排序0x04 希尔排序0x05 归并排序0x06 快速排序0x07 堆排序0x08 计数排序0x09 桶排序0x10 基数排序总结按时间复杂度分类&#xff1a;按稳定性分类按排序方式 Go语言十大排序算法 稳定&#xff1a;如果a原本在b前…

排序算法——十大排序算法总结与对比

一、十大排序算法复杂度对比 二、关于排序算法的总结 1、基数排序仅仅适用于整型数的排序&#xff0c;一般不与另外的排序方法一起比较。 2、关于算法的稳定性&#xff1a;不稳定的算法有 “快希选堆”——快速排序&#xff0c;希尔排序&#xff0c;选择排序和堆排序。 3、关…

十大排序算法(面试必备)

目录 简单排序 1、冒泡排序 2、选择排序 3、插入排序 高级排序 4、希尔排序&#xff08;缩小增量排序&#xff09; 5、归并排序 6、快速排序 7、计数排序 8、堆排序 9、桶排序 10、基数排序 总结&#xff1a; 1、十大排序算法对比 2、基数排序、计数排序、桶排序…

十大排序算法学习

Sort 排序类算法是非常常见的算法&#xff0c;包括了比较类排序与非比较类排序 排序能够解决很多问题&#xff0c;有的编程语言也提供了一些排序算法函数&#xff08;比如C的sort&#xff09;但是掌握基本的排序算法原理以及写法仍然是很重要的&#xff0c;并且排序也是面试常…

十大排序算法(Java)

目录 1.冒泡排序 2.快速排序 3.插入排序 4.希尔排序 5.选择排序 6.堆排序 7.归并排序 8.计数排序&#xff1a;速度快&#xff0c;一般用于整数排序 9.桶排序 10.基数排序 1.冒泡排序 冒泡排序思路&#xff1a;&#xff08;两层for循环&#xff09; 比较相邻的元素。…

十大排序算法(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…