归并排序 快速排序
我们先把数组从中间分成前后两部 分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。
package test_2019_08_03.sort;
/**
* @author xuanyuanpu
* @date 2019/8/8 - 18:07
*/
public class Sort {
public static void main(String[] args) {
int[] arr = {19, 9, 8, 5, 6, 5, 5, 3, -1, 1, 2};
mergeSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "<");
}
}
//归并排序
public static void mergeSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
//方法一 使用临时数组归并
int[] tmp = new int[arr.length];
int i = left;
int j = mid + 1;
int m = right;
for (int x = left; x <= right; x++) {
if (i > mid || j > right) {
break;
}
if (arr[i] <= arr[j]) {
tmp[x] = arr[i];
i++;
m = x;
continue;
} else {
tmp[x] = arr[j];
j++;
m = x;
continue;
}
}
if (j > right) {
for (int k = m+1; k <= right; k++) {
tmp[k] = arr[i];
i++;
}
} else {
for (int k = m+1; k <= right; k++) {
tmp[k] = arr[j];
j++;
}
}
for (int x = left; x <= right; x++) {
arr[x] = tmp[x];
}
//方法二 使用插入排序归并
/* int flag=left;
for (int i = mid+1; i <= right; i++) {
if (arr[i] >= arr[i - 1]) {
return;
}
for (int j = flag ; j < i; j++) {
if (arr[i] > arr[j]) {
continue;
}
int x = arr[i];
for (int n = i; n > j; n--) {
arr[n] = arr[n - 1];
}
arr[j] = x;
flag = j+1;
break;
}
}*/
}
//快速排序
public static void quickSort(int[] arr,int left,int right) {
if (left >= right) {
return;
}
int flag = right;
int start = left;
int end = right-1;
while (start <= end) {
while (start <= end) {
if (arr[start] < arr[flag]) {
start++;
continue;
}
int tmp = arr[flag];
arr[flag] = arr[start];
arr[start] = tmp;
flag = start;
start++;
break;
}
while (start <= end) {
if (arr[end] >= arr[flag]) {
end--;
continue;
}
int tmp = arr[flag];
arr[flag] = arr[end];
arr[end] = tmp;
flag = end;
end--;
break;
}
}
quickSort(arr,left,flag-1);
quickSort(arr,flag+1,right);
}
}