Java 常用八大排序
JAVA常用八大排序
引用:https://blog.csdn.net/qq_45270751/article/details/121066947
1.冒泡排序
2.选择排序
3.插入排序
4.希尔排序
5.堆排序
6.快速排序
7.归并排序
8.计数排序
冒泡排序
原理:在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。
代码实现
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class BubbleSortLesson01 { 6 public static void main(String[] args) { 7 int[] array1={2,5,8,6,9,4,3,7}; 8 System.out.println(Arrays.toString(array1)); 9 bubbleSort(array1); //调用冒泡方法 10 System.out.println(Arrays.toString(array1)); 11 12 } 13 // 冒泡方法 14 public static void bubbleSort(int[] array){ 15 // 控制比较的次数,从最大值初步递减,缩小比较范围。 16 for (int i = array.length; i >0 ; i--) { 17 // 比较的数字逐步递增,且执行大数向右移动。 18 for (int j = 1; j <i; j++) { 19 //比较相邻两个数字的大小 20 if (array[j]<array[j-1]){ 21 //大数向右移动 22 int tmp = array[j]; 23 array[j] = array[j-1]; 24 array[j-1] = tmp; 25 } 26 } 27 } 28 } 29 }
执行结果

代码优化1
假设给定的数组就是有序的 ,利用建立标签,减少排序的搜索的次数。
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class BubbleSortLesson02 { 6 public static void main(String[] args) { 7 int[] array1={2,3,4,5,6,7,9,8}; 8 System.out.println(Arrays.toString(array1)); 9 bubbleSort(array1); //调用冒泡方法 10 System.out.println(Arrays.toString(array1)); 11 12 } 13 // 冒泡方法优化利用flag减少遍历次数。 14 public static void bubbleSort(int[] array){ 15 // 控制比较的次数,从最大值初步递减,缩小比较范围。 16 for (int i = array.length; i >0 ; i--) { 17 // 18 boolean flag = true; //定义一个flag 为true 19 // 比较的数字逐步递增,且执行大数向右移动。 20 for (int j = 1; j <i; j++) { 21 //比较相邻两个数字的大小 22 if (array[j]<array[j-1]){ 23 //大数向右移动 24 int tmp = array[j]; 25 array[j] = array[j-1]; 26 array[j-1] = tmp; 27 flag =false; //执行比较 布尔值为false 28 } 29 } 30 // 没有执行移动,flag为默认值,表示排序完成。 31 if (flag){ 32 break; //跳出循环 33 } 34 } 35 } 36 }
执行结果
代码优化2
假设给定的数组尾部数据是升序的。
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class BubbleSortLesson03 { 6 public static void main(String[] args) { 7 int[] array1={5,3,2,4,7,6,8,9}; 8 System.out.println(Arrays.toString(array1)); 9 bubbleSort(array1); //调用冒泡方法 10 System.out.println(Arrays.toString(array1)); 11 12 } 13 // 冒泡方法优化 跳过尾端升序数字,不进行扫描,缩短搜索时间 14 public static void bubbleSort(int[] array){ 15 // 控制比较的次数,从最大值初步递减,缩小比较范围。 16 for (int i = array.length; i >0 ; i--) { 17 // 设置初始值,在完全有序时有效,结束程序 18 int sortedIndex = 0; 19 // 比较的数字逐步递增,且执行大数向右移动。 20 for (int j = 1; j <i; j++) { 21 //比较相邻两个数字的大小 22 if (array[j]<array[j-1]){ 23 //大数向右移动 24 int tmp = array[j]; 25 array[j] = array[j-1]; 26 array[j-1] = tmp; 27 sortedIndex = j; //记录最后一次移动位置 28 } 29 } 30 // 将最后一次移动位置赋值给i,此时减小了扫描最大值 31 i =sortedIndex; 32 } 33 } 34 }
执行结果
选择排序
原理:每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完

代码实现
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class SelectSortLesson01 { 6 public static void main(String[] args) { 7 int[] array1 = {3,5,9,8,7,6,4,2,1}; 8 System.out.println(Arrays.toString(array1)); 9 selectSort(array1); 10 System.out.println(Arrays.toString(array1)); 11 } 12 //选择排序,找到最大值,依次放在最后 13 public static void selectSort(int[] array) { 14 // 控制扫描的数量,递减 15 for (int i = array.length-1 ; i > 0; i--) { 16 // 定义一个最大值初始下标为0; 17 int imax =0; 18 for (int j = 1; j <= i; j++) { 19 if(array[j]>array[imax]) { 20 // 判断是下标j值否大于下标0值,是那么最大值的更新下标 21 imax = j; 22 } 23 } 24 int tmp = array[i]; 25 array[i] = array[imax]; 26 array[imax] = tmp; 27 } 28 } 29 }
实现结果
优化代码
原理:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
1 package com.luckylu.sortMethod; 2 3 import com.sun.scenario.effect.impl.sw.java.JSWColorAdjustPeer; 4 5 import java.util.Arrays; 6 7 public class SelectSortLesson02 { 8 public static void main(String[] args) { 9 int[] array1 = {3,8,9,5,7,6,4,2,1}; 10 System.out.println(Arrays.toString(array1)); 11 selectSort(array1); 12 System.out.println(Arrays.toString(array1)); 13 } 14 public static void selectSort(int[] array){ 15 int left = 0; // 左区间 16 int right = array.length-1; // 右区间 17 while (left<right){ 18 int imin= left; // 记录最小值的下标 19 int imax = left; // 记录最大值的下标 20 21 for (int i = left; i<=right ; i++) { 22 23 if (array[i] < array[imin]) { 24 imin = i; //更新最小值下标 25 } 26 if (array[i] > array[imax]) { 27 imax = i; //更新最大值下标 28 } 29 } 30 // 交换最小值,调用下面的交换方法 31 swap(array,left,imin); 32 // 例:最小值交换完成,2-8已经交换,再次更新imax值,避免执行最大值交换时,2-8再次交换。 33 if (imax == left){ 34 imax=imin; 35 } 36 // 交换最大值,调用下面交换方法 37 swap(array,right,imax); 38 //调整排序区间 39 left++; 40 right--; 41 } 42 } 43 //常用交换位置的方法 44 public static void swap(int[] array ,int i ,int j){ 45 int tmp =array[i]; 46 array[i] =array[j]; 47 array[j]=tmp; 48 } 49 }
实现结果
插入排序
原理:每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入
代码实现
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class SelectSortLesson03 { 6 public static void main(String[] args) { 7 int[] array1 = {3,8,9,5,7,6,4,2,1}; 8 System.out.println(Arrays.toString(array1)); 9 selectSort(array1); 10 System.out.println(Arrays.toString(array1)); 11 } 12 public static void selectSort(int[] array){ 13 for (int i = 1; i < array.length ; i++) { 14 int insertIndex = i; //下标 15 int insertValue = array[i]; //临时值 16 while (insertIndex > 0 && insertValue < array[insertIndex-1]){ 17 array[insertIndex]=array[insertIndex-1]; 18 insertIndex--; 19 } 20 array[insertIndex]= insertValue; //替换 21 } 22 } 23 }
实现结果
希尔排序
希尔排序是对直接插入排序的优化 ,希尔排序法又称缩小增量法。
原理:插入排序是步长位1的排序,希尔排序是步长不断缩小直到步长1的排序。
代码实现
1 package com.luckylu.sortMethod; 2 3 import java.util.Arrays; 4 5 public class ShellSortLesson { 6 public static void main(String[] args) { 7 int[] array1 = {3,8,9,5,7,6,4,2,1}; 8 System.out.println(Arrays.toString(array1)); 9 shellSort(array1); 10 System.out.println(Arrays.toString(array1)); 11 } 12 13 public static void shellSort(int[] array) { 14 // 步长gap ,gap = array.length/2 间隔几个元素进行排序;gap/=2 实现二叉树; 15 for (int gap = array.length/2; gap >0 ; gap/=2) { 16 //步长位gap的 插入排序 17 for (int i = gap; i <array.length ; i++) { 18 int insertIdex = i; 19 int insertValue = array[i]; 20 while (insertIdex-gap>=0 && insertValue<array[insertIdex-gap]){ 21 array[insertIdex]=array[insertIdex-gap]; 22 insertIdex-=gap; 23 }; 24 array[insertIdex]=insertValue; 25 } 26 } 27 } 28 }
实现结果
堆排序
原理:指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
代码实现
实现结果
快速排序
原理:从待排序区间选择一个数,作为基准值 , 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可 以包含相等的)放到基准值的右边 , 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间 的长度 == 0,代表没有数据
代码实现
实现结果
归并排序
原理:将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子 序列段间有序
代码实现
实现结果
计数排序
原理:计数排序是一种牺牲内存空间来换取低时间的排序算法,同时它也是一种不基于比较的算法。这里的不基于比较指的是数组元素之间不存在比较大小的排序算法
代码实现
实现结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!