ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Java 基础排序算法:冒泡排序与简单选择排序

2026/8/13 9:28:05 拓冰建站 浏览量
Java 基础排序算法:冒泡排序与简单选择排序

Java 基础排序算法:冒泡排序与简单选择排序

摘要:本文介绍两种基础排序算法——冒泡排序与简单选择排序。冒泡排序通过相邻元素两两比较并交换,将最大值逐趟“冒泡”至末尾,平均时间复杂度 (O(n^2)),为稳定排序;简单选择排序每趟扫描未排序区间找出最小值并与首位交换,时间复杂度恒为 (O(n^2)),为不稳定排序。两种算法空间复杂度均为 (O(1)),文中均给出 Java 实现与测试示例。

目录

  • 一、冒泡排序(bubbleSort)
  • 二、简单选择排序(simpleSelectSort)

一、冒泡排序(bubbleSort)

算法核心:比较一组序列中相邻的两个元素,如果出现逆序,就交换。每一趟冒泡排序会将序列中最大值(或最小值)"冒泡"到序列的最后一个位置上,像水中的泡泡一样上浮,所以叫冒泡排序。

核心要点

  • 只和紧邻下一个元素对比
  • 每完成一轮内层循环,末尾一个元素已经排好序,下一轮循环长度-1,不再遍历已排序尾部

冒泡排序算法的特点

  • 时间复杂度:最坏(逆序)(O(n^2)),最好(有序优化后)(O(n)),平均 (O(n^2))
  • 空间复杂度:(O(1)),原地排序,仅用临时变量交换
  • 稳定性:稳定排序(相等元素不会交换位置,相对顺序不变)

JAVA语言实现冒泡排序

packagecom.lgq.ruankao.practice;/** * @author lgq * @email * @date 2026/8/11 13:31 *//** * 冒泡排序 */publicclassMain1{publicstaticvoidbubbleSort(int[]arr){// 增加判空处理,防止空指针异常,让代码更健壮if(arr==null||arr.length<2){return;}intn=arr.length-1;for(inti=0;i<n;i++){// flag用来记录这一趟排序是否发生了交换booleanflag=false;for(intj=0;j<n-i;j++){if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;flag=true;}}// 当flag=false时,就说明整个序列已经有序了,不需要在比较了,直接退出循环即可if(!flag){break;}}}publicstaticvoidprintArr(int[]arr){if(arr==null||arr.length<1){return;}for(inti=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println();}// 测试publicstaticvoidmain(String[]args){// 定义一个序列int[]arr={3,1,5,7,2,4,9,6,8};// 打印排序前的序列System.out.print("排序前的序列:");printArr(arr);// 调用冒泡排序方法bubbleSort(arr);System.out.print("排序后的序列:");printArr(arr);}}

二、简单选择排序(simpleSelectSort)

算法核心:从头到尾扫描一组无序的序列,找出最小的元素与序列的第一位元素交换,并加入到排好序的序列中去(一开始,排好序的序列是空的),这样就完成了第一趟的简单选择排序。然后从剩下的元素开始,重复上面的操作,这样就又会得到最小的元素,将最小的元素也加入到排好序的序列中去。

核心要点

  • 查找最小值下标
  • 定点交换

简单选择排序算法的特点

  • 时间复杂度:最好 / 最坏 / 平均均为 (O(n^2))
  • 空间复杂度:(O(1)),原地排序
  • 稳定性:不稳定排序(相等元素会改变相对位置)

伪代码

n=数组长度forifrom0to n-1:minIndex=i//假定当前首位是最小值//遍历未排序区间,找真正最小值下标forjfromi+1to n-1:ifarr[j]<arr[minIndex]:minIndex=j//一轮只交换一次 swap(arr[i],arr[minIndex])

JAVA语言实现简单选择排序

packagecom.lgq.ruankao.practice;/** * @author lgq * @email * @date 2026/8/11 17:21 */importstaticcom.lgq.ruankao.util.ArrUtil.printArr;importstaticcom.lgq.ruankao.util.ArrUtil.swap;/** * 简单选择排序 */publicclassMain2{publicstaticvoidsimpleSelectSort(int[]arr){for(inti=0;i<arr.length-1;i++){intminValueIndex=i;// `arr.length-1` 会漏掉最后一个元素,最小值找不全,因此内层循环的边界是arr.lengthfor(intj=i+1;j<arr.length;j++){if(arr[j]<arr[minValueIndex]){minValueIndex=j;}}// 将序列的第一个元素与序列中的最小值进行交换// 传入数组和两个下标swap(arr,i,minValueIndex);}}// 测试publicstaticvoidmain(String[]args){int[]arr={1,3,2,4,5,7,8,9,6};// 打印排序前的序列System.out.print("排序前的序列:");printArr(arr);// 调用冒泡排序方法simpleSelectSort(arr);System.out.print("排序后的序列:");printArr(arr);}}

交换函数工具类

packagecom.lgq.ruankao.util;/** * @author lgq * @email * @date 2026/8/12 9:34 */publicclassArrUtil{publicstaticvoidprintArr(int[]arr){if(arr==null||arr.length<1){return;}for(inti=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println();}// 交换a和b的值publicstaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}