0x01 前言
最近又开始review一下JavaSE的知识,才发现之前学的三大经典排序算法–冒泡排序、选择排序和插入排序 的实现还是有些许的不足,所以重新实现了一下,顺便也复习一下JavaSE的知识。
0x02 冒泡排序

排序具体步骤:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素为最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个(如果第N轮,则为倒数N个);
- 重复以上步骤,直到排序完成。
具体流程图:

代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public void bubbleSort(int... arr){ boolean exchange_flag; for(int j=0;j<arr.length-1;j++){ exchange_flag = false; for(int i=0;i<arr.length-1-j;i++){ if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; exchange_flag = true; } } if(!exchange_flag){ break; } } }
|
时间复杂度分析:
- 最好情况:如果待排序的数组已经是有序的,那么只需要进行一次遍历,时间复杂度为 O(n);
- 最坏情况:如果待排序的数组是逆序的,那么需要n-1轮遍历,每一轮遍历需要比较n-i次,时间复杂度为O(n^2);
0x03 选择排序

排序具体步骤:
- 从数组的第一个位置开始,认为当前元素是最小值。
- 在当前元素之后的未排序部分中,逐个比较,寻找最小值。
如果找到比当前最小值更小的元素,更新最小值的索引。
- 将找到的最小值与当前元素交换位置。
- 移动到下一个位置,重复步骤以上步骤。
具体流程图:

代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public void selectSort(int... arr){ for(int i=0;i<arr.length-1;i++){ int minIndex = i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[minIndex]){ minIndex = j; } } if(minIndex!=i){ int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } }
|
时间复杂度分析:
- 最好情况:O(n^2);
- 最坏情况:O(n^2);
0x04 插入排序

排序具体步骤:
- 初始假设:将第一个元素视为已经排序的部分。
从第二个元素开始:
- 依次取出未排序部分的元素,与已排序部分从后向前比较。
找到适当位置后,将该元素插入。
- 重复步骤 2,直到所有元素都插入完成。
具体流程图:

代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void insertSort(int... arr){ for(int i=1;i<arr.length;i++){ int current = arr[i]; int preIndex = i-1; while(preIndex>=0 && arr[preIndex]>current){ arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = current; } }
|
时间复杂度分析:
- 最好情况(数组已经有序):每轮只需比较一次,时间复杂度为 O(n^2);
- 最坏情况(数组逆序):每轮需要比较并移动所有已排序元素,时间复杂度为 O(n^2);
- 平均情况:O(n^2)