快排:
时间复杂度最差:O(n^2),平均O(nlgn)
public static void myQuickSort(Integer[] a, int start, int end){
//a:待排序数组
//start:待排序起点下标
//end:待排序终点下标
if (start >= end) return;
int tar = a[start];
int s = start+1;
int b = end;
while (s <= b) {
while (s <= b && a[s] <= tar) s++;
while (s <= b && a[b] >= tar) b--;
if (s < b){
int temp = a[s];
a[s] = a[b];
a[b] = temp;
}
}
a[start] = a[b];
a[b] = tar;
myQuickSort(a, start, b-1);
myQuickSort(a, b+1, end);
}
归并排序:
时间复杂度O(nlgn)
public void merge(int[] a, int p, int q, int r) {
//将带排序数组a下标从p到q和q+1到r合并。
int n1 = q-p+1;
int n2 = r-q;
int[] arr1 = new int[n1];
int[] arr2 = new int[n2];
for (int i = 0; i < n1; i++) arr1[i] = a[p+i];
for (int i = 0; i < n2; i++) arr2[i] = a[q+1+i];
int arr1_id = 0;
int arr2_id = 0;
while (p < r) {
if (arr1[arr1_id] < arr2[arr2_id]) {
a[p++] = arr1[arr1_id++];
}else {
a[p++] = arr2[arr2_id++];
}
if (arr1_id == n1) {
while(arr2_id < n2)
a[p++] = arr2[arr2_id++];
}
if (arr2_id == n2) {
while(arr1_id < n1)
a[p++] = arr1[arr1_id++];
}
}
}
public void mergeSort(int[] a, int p, int r) {
//将带排序数组:a。
//起点下标:p
//终点下标:r
if (p == r) return;
int q = (p + r) / 2;
mergeSort(a, p, q);
mergeSort(a, q+1, r);
merge(a, p, q, r);
}
冒泡排序
时间复杂度O(n^2)
public void bubbleSort(int[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
boolean change = false;
for (int j = 0; j < n-i-1; j++) {
if (a[j] > a[j+1]) {
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
change = true;
}
}
if (!change) return;
}
}
插入排序:
时间复杂度最差:O(n^2),最好O(n)
public void insertionSort(int[] a) {
//a:待排序数组
for (int i = 0; i < a.length; i++) {
int id = i;
int temp = a[i];
for (int j = i-1; j >= 0; j--) {
if (temp < a[j]) id = j;
else break;
}
int t = i;
while (t > id) {
a[t] = a[t-1];
t--;
}
a[id] = temp;
}
}
选择排序
时间复杂度最差:O(n^2)
public void selectSort(int[] a) {
for(int i = 0; i < a.length; i++) {
int min = i;
for (int j = i+1; j < a.length; j++) {
if (a[j] < a[min]) min = j;
}
if (min != i) {
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}