常见排序方法汇总
1.冒泡排序,时间复杂度O(n^2),空间复杂度O(1)
public static void bubble(int []arr){
if(arr == null || arr.length < 2){
return ;
}
for (int end = arr.length; end > 0; end--) {
for (int i = 0; i < end -1; i++) {
if(arr[i] > arr[i+1]){
swap(arr,i,i+1);
}
}
}
}
public static void swap(int arr[] ,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
2.选择排序,时间复杂度O(n^2),空间复杂度O(1)
public static void selectSort(int arr[]){
if(arr.length < 2 || arr == null){
return;
}
for (int i = 0; i < arr.length-1; i++) {
int index = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]){
index = j;
}
}
swap(arr, index, i);
}
}
3.插入排序,时间复杂度O(n^2),空间复杂度O(1)
public static void insertSort(int[] arr){
if(arr == null || arr.length < 2){
return ;
}
for(int i = 0;i < arr.length - 1;i++){
for(int j = i+1;j > 0 && arr[j] > arr[j-1];j--){
swap(arr,j,j-1);
}
}
}
4.归并排序,时间复杂度O(nlogn),空间复杂度O(n)
public static void mergeSort(int []arr){
if(arr == null || arr.length < 2){
return ;
}
sort(arr, 0, arr.length-1);
}
public static void sort(int[] arr,int L, int R){
if(L == R){
return ;
}
int mid = L+( R-L)/2;
sort(arr, L, mid);
sort(arr, mid+1, R);
merge(arr, L, mid, R);
}
public static void merge(int []arr,int L, int mid,int R){
int help[] = new int[R - L +1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
while(p1 <= mid && p2 <= R ){
help[i++] = arr[p1] < arr[p2] ? arr[p1++] :arr[p2++];
}
while(p1 <= mid){
help[i++] = arr[p1++];
}
while(p2 <= R){
help[i++] = arr[p2++];
}
for (int j = 0; j < help.length; j++) {
arr[L+j] = help[j];
}
}
5.快速排序,时间复杂度O(nlogn),空间复杂度O(n)
public static void quickSort(int arr[] ,int L,int R){
if(L < R){
int x = sortNum(arr, arr[R]);
quickSort(arr, L, x-1);
quickSort(arr, x+1, R);
}
}
public static int sortNum(int []arr,int num){
int x = -1;
for (int i = 0; i < arr.length; i++) {
if(arr[i] <= num){
swap(arr, i, ++x);
}
}
return x;
}
/**
*基于荷兰国旗问题的改进
*/
public static void quickSort1(int arr[] ,int L,int R){
if(L < R){
int [] p = partition(arr, L, R,arr[R]);
quickSort(arr, L, p[0]-1);
quickSort(arr, p[1]+1, R);
}
}
/**
*随机快排序
*/
public static void quickSort2(int arr[] ,int L,int R){
if(L < R){
swap(arr,L +(int) (Math.random()*(R - L + 1)),R);
int [] p = partition(arr, L, R, arr[R]);
quickSort2(arr, L, p[0]-1);
quickSort2(arr, p[1]+1, R);
}
}
public static int[] partition(int arr[],int L,int R,int num){
int less = L - 1;
int more = R + 1;
int cur = L;
while(cur < more){
if(arr[cur] < num){
swap(arr,++less, cur++);
}else if(arr[cur] > num){
swap(arr, cur, --more);
}else{
cur++;
}
}
return new int[]{less + 1,more - 1};
}
6.堆排序,时间复杂度O(nlogn),空间复杂度O(1)
public static void heapSort(int []arr){
if(arr == null || arr.length < 2){
return;
}
for (int i = 0; i < arr.length; i++) {
heapInsert(arr,i);
}
int heapSize = arr.length;
swap(arr,0,--heapSize);
while (heapSize > 0) {
heapify(arr, 0, heapSize);
swap(arr, 0, --heapSize);
}
}
private static void heapInsert(int[] arr, int index) {
while(arr[index] > arr[(index-1)/2]){
swap(arr, index,(index-1)/2);
index = (index-1)/2;
}
}
private static void heapify(int arr[],int index,int heapSize){
int left = index * 2 + 1;
while(left < heapSize){
int largest = left + 1 <heapSize && arr[left +1] > arr[left]
? left + 1 :left;
largest = arr[largest] > arr[index] ? largest : index;
if(largest == index){
break;
}
swap(arr, largest, index);
index = largest;
left = index * 2 + 1;
}
}