归并排序与希尔排序
希尔排序
package com.m.suan_pai;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = {65, 45, 76, 546, 4, 5, 72, 36, 45, 72, 346, 52};
xier(arr);
System.out.println(Arrays.toString(arr));
//[4, 5, 36, 45, 45, 52, 65, 72, 72, 76, 346, 546]
}
public static void xier(int[] arr) {
//1.定义跨度
int k = 1;
while (k < arr.length) {
k = k * 2 + 1;
}
do {
k /= 2;
for (int i = k; i < arr.length; i++) {
int temp = arr[i];
int j = i - k;
while (j >= 0 && arr[j] > temp) {
arr[j + k] = arr[j];
j -= k;
}
arr[j + k] = temp;
}
} while (k > 1);
}
}
归并排序
package com.m.suan_pai;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = {65, 45, 76, 546, 4, 5, 72, 36, 45, 72, 346, 52};
sort(arr);
System.out.println(Arrays.toString(arr));
//[546, 346, 76, 72, 72, 65, 52, 45, 45, 36, 5, 4]
}
public static void sort(int[] arr) {
int[] temp = new int[arr.length];
sort(arr, 0, arr.length - 1, temp);
}
public static void sort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
//左分
sort(arr, 0, mid, temp);
//右分
sort(arr, mid + 1, right, temp);
//合并
hebing(arr, left, mid, right, temp);
}
}
public static void hebing(int[] arr, int left, int mid, int right, int[] temp) {
//临时数组指针
int index = 0;
//左指针
int i = left;
//右指针
int j = mid + 1;
while (i <= mid && j <= right) {
if (arr[j] > arr[i]) {
temp[index++] = arr[j++];
} else {
temp[index++] = arr[i++];
}
}
while (i <= mid) {
temp[index++] = arr[i++];
}
while (j <= right) {
temp[index++] = arr[j++];
}
index = 0;
while (left <= right) {
arr[left++] = temp[index++];
}
}
}
希尔排序核心代码,易错点
int i = left;
int j = mid + 1;
int index = 0;
while (i <= mid && j <= right) {
if (arr[j] > arr[i]) {
temp[index++] = arr[j++];
} else {
temp[index++] = arr[i++];
}
}