目录
1.选择排序
每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。
1.1 Java代码实现
public static void selectSort(int[] arr) {
for(int i = 0; i < arr.length - 1; i++) {
int max = 0;
for(int j = 1; j < arr.length - i; j++) {
if(arr[j] > arr[max]) {
max = j;
}
}
int tmp = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = arr[max];
arr[max] = tmp;
}
}
1.2性能分析
时间复杂度 | 空间复杂度 |
O(n^2) | O(1) |
数据不敏感 |
1.3 稳定性
不稳定的排序
2.冒泡排序
在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。
2.1 Java代码实现
public static void bubbleSort1(int[] arr) {//普通的冒泡排序
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j +1]) {
swap(arr,j,j+ 1);
}
}
}
}
2.2优化
每次比较时定义一个 boolean 类型的变量,判断是否进入交换界面,若没有进入则表示后续元素都有序,因此可以跳出循环。
public static void bubbleSort2(int[] arr) {//优化后的冒泡排序
for(int i = 0; i < arr.length; i++) {
boolean isChange = false;
for(int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j + 1]) {
swap(arr,j, j + 1);
isChange = true;
}
}
if(!isChange) {
break;
}
}
}
2.3性能分析
时间复杂度 | 空间复杂度 | ||
最好 | 平均 | 最坏 | |
O(n) | O(n^2) | O(n^2) | O(1) |
数组有序 | 数组逆序 |
2.4稳定性
稳定的排序
3.快速排序
1. 从待排序区间选择一个数,作为基准值(pivot);
2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可 以包含相等的)放到基准值的右边;
3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间 的长度 == 0,代表没有数据。
3.1Java解决问题代码
public static int quickSortIndex(int[] arr,int start, int end) {
int low = start;
int high = end;
int pivot = arr[start];
while (low < high) {
while (low < high && arr[high] > pivot) {
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] < pivot) {
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
public static void quickSort(int[] arr, int start, int end) {
if(start >= end) {
return;
}
int pivot = quickSortIndex(arr,start,end);
quickSortIndex(arr,start,pivot - 1);
quickSortIndex(arr, pivot + 1,end);
}
3.2性能分析
时间复杂度 | 空间复杂度 | ||||
最好 | 平均 | 最坏 | 最好 | 平均 | 最坏 |
O(n*log(n)) | O(n*log(n)) | O(n^2) | O(log(n)) | O(log(n)) | O(n) |
3.3稳定性
不稳定排序