尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

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(arrnull||arr.length2){return;}intnarr.length-1;for(inti0;in;i){// flag用来记录这一趟排序是否发生了交换booleanflagfalse;for(intj0;jn-i;j){if(arr[j]arr[j1]){inttemparr[j];arr[j]arr[j1];arr[j1]temp;flagtrue;}}// 当flagfalse时就说明整个序列已经有序了不需要在比较了直接退出循环即可if(!flag){break;}}}publicstaticvoidprintArr(int[]arr){if(arrnull||arr.length1){return;}for(inti0;iarr.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:minIndexi//假定当前首位是最小值//遍历未排序区间找真正最小值下标forjfromi1to n-1:ifarr[j]arr[minIndex]:minIndexj//一轮只交换一次 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(inti0;iarr.length-1;i){intminValueIndexi;// arr.length-1 会漏掉最后一个元素最小值找不全因此内层循环的边界是arr.lengthfor(intji1;jarr.length;j){if(arr[j]arr[minValueIndex]){minValueIndexj;}}// 将序列的第一个元素与序列中的最小值进行交换// 传入数组和两个下标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(arrnull||arr.length1){return;}for(inti0;iarr.length;i){System.out.print(arr[i] );}System.out.println();}// 交换a和b的值publicstaticvoidswap(int[]arr,inti,intj){inttemparr[i];arr[i]arr[j];arr[j]temp;}}
返回列表