歸并排序:算法復(fù)雜度logN
先不斷二分,直到分成單個(gè)元素,無法再分為止,然后比較大小合并處理
import java.util.*;
public class MergeSort {
public int[] mergeSort(int[] A, int n) {
if(A.length == 0 || n <= 0) {
return A;
}
mergeSort(A, 0, n-1);
return A;
}
public void mergeSort(int[] A, int left , int right) {
if(left >= right) { //注意是>= 相等的時(shí)候代表不可再分
return;
}
int mid = left + (right-left)/2;
mergeSort(A, left, mid); //二分
mergeSort(A, mid+1, right); //二分
merge(A, left, mid, right); //歸并
}
public void merge(int[] A, int left, int mid, int right) {
//[left, mid]
//[mid+1, right]
int[] arr = new int[right-left+1];
int index = -1;
int l = left;
int r = mid+1;
while(l <= mid && r <= right) {
if(l <= mid && A[l] < A[r]) {
arr[++ index] = A[l ++];
}
else if(r <= right && A[r] <= A[l]) {
arr[++ index] = A[r ++];
}
}
while(l <= mid) {
arr[++ index] = A[l ++];
}
while(r <= right) {
arr[++ index] = A[l ++];
}
for(int i = 0; i < right-left+1; i++) {
A[left+i] = arr[i];
}
}
}
快速排序
- 思想:隨機(jī)在數(shù)組中選擇一個(gè)數(shù)據(jù)random, <random的放在左邊 >random的放在右邊,然后左邊, 右邊分別快排
import java.util.*;
public class QuickSort {
public int[] quickSort(int[] A, int n) {
if(A.length == 0 || n <= 0) {
return A;
}
quickSort(A, 0, n-1);
return A;
}
public void quickSort(int[] A, int left, int right) {
if(left >= right) {
return;
}
int index = partition(A, left, right);
quickSort(A, left, index-1);
quickSort(A, index+1, right);
}
public int partition(int[] A, int left, int right) {
//分割
int comparator = A[right];
int l = left-1;
for(int i = left; i < right; i++) {
if(A[i] < comparator) {
swap(A, ++l, i);
}
}
swap(A, ++ l, right);
return l;
}
public void swap(int[] A, int l, int r) {
int tmp = A[l];
A[l] = A[r];
A[r] = tmp;
}
}
堆排序
import java.util.*;
public class HeapSort {
public int[] heapSort(int[] A, int n) {
if(A.length == 0 || n <= 0) {
return A;
}
for(int i = n/2-1; i >= 0; i--) {
shiftUp(A, i, n-1);
}
for(int j = n-1; j > 0; j--) {
swap(A, 0, j);
shiftUp(A, 0, j-1);
}
return A;
}
public void swap(int[] A, int start, int end) {
int tmp = A[start];
A[start] = A[end];
A[end] = tmp;
}
public void shiftUp(int[] A, int start, int end) {
if(start >= end) {
return;
}
int parent = start;
int child = parent*2 + 1; //左子節(jié)點(diǎn)
int val = A[parent];
while(child <= end) {
if(child < end && A[child] < A[child+1]) { //這里child < end 必須, 否則下面child++會(huì)超出范圍
child++;
}
if(A[child] > val) {
A[parent] = A[child];
parent = child;
child = parent*2+1;
} else {
break;
}
}
A[parent] = val;
}
}
希爾排序
import java.util.*;
public class ShellSort {
public int[] shellSort(int[] A, int n) {
if(A.length == 0 || n <= 0) {
return A;
}
int feet = n/2;
int index = 0;
while(feet > 0) {
for(int i = feet; i<n; i++) {
index = i;
while(index >= feet) { //注意這里的循環(huán), 必須到達(dá)最前方
if(A[index] < A[index-feet]) {
swap(A, index, index-feet);
index = index - feet;
} else {
break;
}
}
}
feet /= 2;
}
return A;
}
public void swap(int[] A, int i, int j) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}