2026/4/18 12:04:23
网站建设
项目流程
安徽省地图,百度搜索排名优化,wordpress 文章分页,网站服务器异常是什么意思Java 中的七大经典排序算法详解
在 Java 中讨论排序算法时#xff0c;通常指以下七种最经典、最常被考察的排序算法#xff08;大学数据结构课 面试最常出现的组合#xff09;#xff1a;
冒泡排序 (Bubble Sort)选择排序 (Selection Sort)插入排序 (Insertion Sort)希尔…Java 中的七大经典排序算法详解在 Java 中讨论排序算法时通常指以下七种最经典、最常被考察的排序算法大学数据结构课 面试最常出现的组合冒泡排序 (Bubble Sort)选择排序 (Selection Sort)插入排序 (Insertion Sort)希尔排序 (Shell Sort)归并排序 (Merge Sort)快速排序 (Quick Sort)堆排序 (Heap Sort)下面给出Java 实现 核心思想 时间/空间复杂度 稳定性 适用场景的完整对比与代码。复杂度与特性一览表排序算法最好时间平均时间最坏时间空间复杂度稳定性原地排序适用场景简述冒泡排序O(n)O(n²)O(n²)O(1)稳定是小规模数据、教育演示选择排序O(n²)O(n²)O(n²)O(1)不稳定是小规模数据、交换次数最少要求插入排序O(n)O(n²)O(n²)O(1)稳定是近乎有序、小规模数据希尔排序O(n log n) ~ O(n^{1.3})O(n^{1.3}) ~ O(n²)O(n²)O(1)不稳定是中等规模数据改进插入排序归并排序O(n log n)O(n log n)O(n log n)O(n)稳定否大数据、稳定排序需求、外部排序快速排序O(n log n)O(n log n)O(n²)O(log n)不稳定是通用排序、平均性能最好Java Arrays.sort堆排序O(n log n)O(n log n)O(n log n)O(1)不稳定是需要 O(1) 额外空间、大数据1.冒泡排序Bubble SortpublicstaticvoidbubbleSort(int[]arr){intnarr.length;for(inti0;in-1;i){booleanswappedfalse;for(intj0;jn-i-1;j){if(arr[j]arr[j1]){// 交换inttemparr[j];arr[j]arr[j1];arr[j1]temp;swappedtrue;}}// 优化如果一趟没有交换已经有序if(!swapped)break;}}2. 选择排序Selection SortpublicstaticvoidselectionSort(int[]arr){intnarr.length;for(inti0;in-1;i){intminIdxi;for(intji1;jn;j){if(arr[j]arr[minIdx]){minIdxj;}}// 交换inttemparr[i];arr[i]arr[minIdx];arr[minIdx]temp;}}3. 插入排序Insertion SortpublicstaticvoidinsertionSort(int[]arr){intnarr.length;for(inti1;in;i){intkeyarr[i];intji-1;// 将比 key 大的元素向后移动while(j0arr[j]key){arr[j1]arr[j];j--;}arr[j1]key;}}4. 希尔排序Shell SortpublicstaticvoidshellSort(int[]arr){intnarr.length;// 初始间隔可以有很多取法这里用 n/2 递减for(intgapn/2;gap0;gap/2){// 对每个分组进行插入排序for(intigap;in;i){inttemparr[i];intj;for(ji;jgaparr[j-gap]temp;j-gap){arr[j]arr[j-gap];}arr[j]temp;}}}5. 归并排序Merge SortpublicstaticvoidmergeSort(int[]arr){if(arrnull||arr.length1)return;int[]tempnewint[arr.length];mergeSort(arr,0,arr.length-1,temp);}privatestaticvoidmergeSort(int[]arr,intleft,intright,int[]temp){if(leftright)return;intmidleft(right-left)/2;mergeSort(arr,left,mid,temp);mergeSort(arr,mid1,right,temp);merge(arr,left,mid,right,temp);}privatestaticvoidmerge(int[]arr,intleft,intmid,intright,int[]temp){intileft,jmid1,kleft;while(imidjright){temp[k]arr[i]arr[j]?arr[i]:arr[j];}while(imid)temp[k]arr[i];while(jright)temp[k]arr[j];System.arraycopy(temp,left,arr,left,right-left1);}6. 快速排序Quick Sort——最经典版本publicstaticvoidquickSort(int[]arr){if(arrnull||arr.length1)return;quickSort(arr,0,arr.length-1);}privatestaticvoidquickSort(int[]arr,intlow,inthigh){if(lowhigh)return;// 优化小数组用插入排序if(high-low10){insertionSort(arr,low,high);return;}intpivotIndexpartition(arr,low,high);quickSort(arr,low,pivotIndex-1);quickSort(arr,pivotIndex1,high);}privatestaticintpartition(int[]arr,intlow,inthigh){// 随机化 pivot 防止最坏情况intrandomIdxlow(int)(Math.random()*(high-low1));swap(arr,randomIdx,high);intpivotarr[high];intilow-1;for(intjlow;jhigh;j){if(arr[j]pivot){i;swap(arr,i,j);}}swap(arr,i1,high);returni1;}privatestaticvoidswap(int[]arr,inti,intj){inttemparr[i];arr[i]arr[j];arr[j]temp;}privatestaticvoidinsertionSort(int[]arr,intlow,inthigh){for(intilow1;ihigh;i){intkeyarr[i];intji-1;while(jlowarr[j]key){arr[j1]arr[j];j--;}arr[j1]key;}}7. 堆排序Heap SortpublicstaticvoidheapSort(int[]arr){intnarr.length;// 建堆从第一个非叶子节点开始for(intin/2-1;i0;i--){heapify(arr,n,i);}// 依次把最大值放到末尾for(intin-1;i0;i--){swap(arr,0,i);heapify(arr,i,0);}}privatestaticvoidheapify(int[]arr,intn,inti){intlargesti;intleft2*i1;intright2*i2;if(leftnarr[left]arr[largest])largestleft;if(rightnarr[right]arr[largest])largestright;if(largest!i){swap(arr,i,largest);heapify(arr,n,largest);}}面试最常问的对比与总结问题哪种排序最稳定 → 归并排序、插入排序、冒泡排序哪种排序空间复杂度最低 → 堆排序、选择排序、插入排序、冒泡排序、希尔排序O(1)为什么 Java 的 Arrays.sort() 默认使用快速排序 双轴快速排序 插入排序混合快速排序最坏情况如何避免随机化 pivot、三数取中、双轴快排什么时候用归并排序比快速排序更好需要稳定排序、大数据外部排序、链表排序如果你正在准备面试建议把快速排序、归并排序、堆排序的代码 手写 partition / merge / heapify 过程练熟这是高频手撕代码题。需要哪一个算法的更详细的动图讲解思路、边界case分析、还是完整测试代码或者想看 Java 中内置排序Arrays.sort、Collections.sort的底层实现细节