可视化:https://visualgo.net/zh/sorting
复杂度:
冒泡排序
private static void bubbleSort(int[] arr) {
int len = arr.length;
for (int i = 0; i < len; i++) {
for (int j = 1; j < len - i; j++) {
if (arr[j - 1] > arr[j]) {
swap(arr, j - 1, j);
}
}
}
}
插入排序
private static void insertSort(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; i++) {
int temp = arr[i];
int j = i;
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
希尔排序
private static void shellSort(int[] arr) {
int len = arr.length;
int gap = 1;
while(gap < len/3) gap = (gap*3)+1;
for(;gap>0;gap/=3) {
for(int i=gap;i<len;i++) {
int t = arr[i];
int k=i-gap;
while(k>=0&&arr[k]>t) {
arr[k+gap] = arr[k];
k-=gap;
}
arr[k+gap] = t;
}
}
}
快速排序
private static void quickSort(int[] arr, int low, int high) {
if (low >= high) return;
int t = patition(arr, low, high);
quickSort(arr, low, t - 1);
quickSort(arr, t + 1, high);
}
private static int patition(int[] arr, int low, int high) {
int i = low, j = low;
while (j <= high) {
while (j <= high && arr[j] > arr[low])
j++;
if (j > high) break;
swap(arr, i, j);
i++;
j++;
}
swap(arr, i - 1, low);
return i - 1;
}
归并排序
private static void mergeSort(int[] arr, int low, int high) {
if(low == high) return;
int mid = (high-low)/2+low;
mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, mid, high);
}
private static void merge(int[] arr, int lo, int mid, int hi) {
int[] temp = new int[arr.length];
int i=lo,j=mid+1, pos=0;
while(i<=mid||j<=hi) {
if(i > mid) while(j<=hi) temp[pos++] = arr[j++];
else if(j > hi) while(i<=mid) temp[pos++] = arr[i++];
else {
int t1 = arr[i];
int t2 = arr[j];
if(t1 < t2) temp[pos]=arr[i++];
else temp[pos] = arr[j++];
pos++;
}
}
for(int k=hi; k>=lo; k--) arr[k] = temp[--pos];
}
计数排序
//对n个0-k范围的数进行排序
private static void countSort(int[] arr) {
int k = 10;
int[] count = new int[k];
for(int i=0; i<arr.length;i++) count[arr[i]]++;
int cnt = 0;
for(int i=0; i<count.length;i++) {
int t = count[i];
while(t-->0) arr[cnt++] = i;
}
}
基数排序
private static void radixSort(int[] arr) {
int tMax = arr[0];
int len = arr.length;
int[][] bucket = new int[10][len+1];
for(int i=0; i<len;i++) if(arr[i]>tMax) tMax=arr[i];
int radix = 1;
while(tMax!=0) {
tMax /=10;
radix++;
}
int t = 1;
for(int i=1; i<=radix; i++) {
t *= 10;
bucket = new int[10][len+1];
for(int j=0; j<len;j++) {
int pos = arr[j]%t/(t/10);
bucket[pos][++bucket[pos][0]] = arr[j];
}
int cnt = 0;
for(int k=0; k<10; k++) {
for(int j=1; j<=bucket[k][0];j++) arr[cnt++]=bucket[k][j];
}
}
}
堆排序
https://www.cnblogs.com/chengxiao/p/6129630.html
private static void heapSort(int[] arr) {
for(int k=arr.length/2-1; k>=0; k--) adjust(arr, k, arr.length);
for(int i=arr.length-1;i>0;i--) {
swap(arr, 0, i);
adjust(arr, 0, i);
}
}
private static void adjust(int[] arr, int index, int length) {
int temp = arr[index];
for(int k=2*index+1;k<length;k=2*k+1) {
if(k+1<length&&arr[k+1]>arr[k]) k++;
if(arr[k]>temp) {
arr[index] = arr[k];
index = k;
} else break;
arr[index] = temp;
}
}