1、快速排序
// 时间复杂度:O(nlogn)
private static void quickSort(int[] arr,int start,int end) {
// 递归出口
if(arr==null && start>=end && arr.length<=1) {
return;
}
// 调用分治方法
int mid = partition(arr,start,end);
quickSort(arr,start,mid);
quickSort(arr,mid+1,end);
}
private static int partition(int[] arr,int start,int end){
// 选出一个值当基准数据,然后遍历比较,大的放一端,小的放另一端
int base = arr[start]; //挖坑 arr[start]
while(start<end){
while(start<end && arr[end]>=base) {
--end;
}
if(start<end) {
arr[start] = arr[end]; // 填坑arr[start],但是出现了新坑arr[end]
++start;
}
// 在前面找到比base小的数据
while(start<end && arr[start]<=base) {
++start;
}
if(start<end) {
arr[end] = arr[start];
--end;
}
}
arr[start] = base;
return start;
}
2、冒泡排序
// 时间复杂度:O(n²)
private static void bubbleSort(int[] arr){
if(arr==null) {
return;
}
// 每一趟循环,将最值浮到最上面,想象冒泡的场景
int temp;
boolean isSorted;
for(int i=0; i<arr.length-1; i++) {
isSorted = true;
for(int j=1; j<arr.length-i; j++) {
if(arr[j-1] > arr[j]) {
temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
isSorted = false;
}
}
if(isSorted) {
// 没有数据交换,说明已经排序好了数据,没必要再循环
break;
}
}
}
3、选择排序
// 时间复杂度:O(n²)
private static void selectionSort(int[] arr) {
if(arr==null) {
return;
}
int i,j,min,len = arr.length;
// 每一趟循环要找到最小值的坐标
for(i=0; i<len-1; i++) {
min = i;
for(j=i+1; j<len; j++) {
if(arr[j] < arr[min] ) {
min = j;
}
}
if(min!=i) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
4、插入排序
// 时间复杂度:O(n²)
private static void insertionSort(int[] arr) {
if(arr==null) {
return;
}
int insertValue;
int j;
for(int i=1; i<arr.length; i++) {
// 取出待插入比较的数据
insertValue = arr[i];
j=i;
// 待插入数据的下标之前的数据和待插入数据比较,满足条件移位
while(j>0 && arr[j-1] > insertValue) {
arr[j] = arr[j-1];
j--;
}
arr[j] = insertValue
}
}