一、时间复杂度
的三种排序方法
1.1 选择排序
//选择排序
public static void selectSort(int[] arr) {
if(arr == null || arr.length < 2) return;
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;
swap(arr, i, minIndex);
}
}
1.2 冒泡排序
//冒泡排序
public static void bubbleSort(int[] arr) {
if(arr == null || arr.length < 2) return;
for(int e = arr.length - 1; e > 0; e--) {
for(int i = 0; i < e; i++) {
if(arr[i] > arr[i+1])
swap(arr, i, i+1);
}
}
}
1.3 插入排序
//插入排序
public static void insertSort(int[] arr) {
if(arr == null || arr.length < 2) return;
for(int i = 1; i < arr.length; i++) {
for(int j = i; i > 0 && arr[j-1] > arr[j]; j--)
swap(arr, j-1, j);
}
}
附:swap的两种方法
//swap方法一
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//swap方法二
private static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
二、时间复杂度___的排序方法
2.1 快速排序
前三种排序都不需要递归;快排需要递归形式实现。
public class QuickSort {
public static void quickSort(int[] nums) {
quickSort(nums, 0, nums.length-1);
}
//递归函数
private static void quickSort(int[] nums, int lo, int hi) {
if(lo >= hi) return;
int k = partition(nums, lo, hi);
quickSort(nums, lo, k-1);
quickSort(nums, k+1, hi);
}
//partition函数是快排的精髓所在
private static int partition(int[] nums, int lo, int hi) {
int base = nums[lo];
int j = lo;
for(int i = lo+1; i <= hi; i++) {
if(nums[i] < base) {
j++;
swap(nums, j, i);
}
}
swap(nums, lo, j);
return j; //返回值j是以nums[lo]作为基准,将数组左右分成两组之后,基准元素在数组中的索引位置
}
private static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
public static void main (String[] args) {
int[] nums = {1,2,2,3,4,5};
quickSort(nums);
System.out.println(Arrays.toString(nums));
}