排序算法学习笔记
插入排序
时间复杂度:O(N^2),空间:O(N)
描述:向一个已经排序的串中插入值。
public static void sort(int[] arr){
int length = arr.length;
int j = 0;
for (int p = 1; p < length; p++) {
int tmp = arr[p];
for (j = p; j > 0 && tmp < arr[j - 1]; j--) {
arr[j] = arr[j - 1];
}
arr[j] = tmp;
}
}
归并排序
时间复杂度:O(NlogN) 空间复杂度:O(2N)
描述:合并两个有序串
public static void sort(int[] arr){
int[] tmp = new int[arr.length];
msort(arr, 0, arr.length - 1, tmp);
}
private static void msort(int[] arr, int left, int right, int[] tmp) {
if(left < right){
int m = (left + right)/2;
msort(arr, left, m, tmp);
msort(arr, m + 1, right, tmp);
merge(arr, left, m + 1, right, tmp);
}
}
private static void merge(int[] arr, int leftPos, int rightPos, int rightEnd, int[] tmp) {
int leftEnd = rightPos - 1;
int tp = leftPos;
int nums = rightEnd - leftPos + 1;
while (leftPos <= leftEnd && rightPos <= rightEnd){
if(arr[leftPos] <= arr[rightPos]){
tmp[tp++] = arr[leftPos++];
}else {
tmp[tp++] = arr[rightPos++];
}
}
while (leftPos <= leftEnd){
tmp[tp++] = arr[leftPos++];
}
while (rightPos <= rightEnd){
tmp[tp++] = arr[rightPos++];
}
for (int i = 0; i < nums; i++, rightEnd--) {
arr[rightEnd] = tmp[--tp];
}
}
快速排序
时间复杂度:O(NlogN) 空间复杂度:O(N)
描述:取一个合适的中值,将串分割为两部分,左边是小于等于中值的集合,右边是大于等于中值的集合,
串长度小于等于10时候,采用插入排序以提升性能。
private static int cutoff = 9;
public static void sort(int[] arr){
quick(arr, 0, arr.length - 1);
}
private static void quick(int[] arr, int left, int right) {
if(left + cutoff <= right){
int pov = media(arr, left, right);
int i = left, j = right;
for (;;){
while (arr[++i] < pov){}
while (arr[--j] > pov){}
if(i < j){
swap(arr, i, j);
}else {
break;
}
}
swap(arr, i, right);
quick(arr, left, i - 1);
quick(arr, i + 1, right);
}else {
insertSort(arr, left, right);
}
}
private static void insertSort(int[] arr, int left, int right) {
int i = left;
int j;
for (i = i + 1; i < right + 1; i++){
int tmp = arr[i];
for (j = i; j > 0 && tmp < arr[j - 1]; j--){
arr[j] = arr[j - 1];
}
arr[j] = tmp;
}
}
private static int media(int[] arr, int left, int right) {
int m = (left + right)/2;
if(arr[m] < arr[left]){
swap(arr, m, left);
}
if(arr[right] < arr[left]){
swap(arr, right, left);
}
if(arr[m] < arr[right]){
swap(arr, m, right);
}
return arr[right];
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}