希尔排序:
将一个数组进行递归的分为两半进行排序, 然后将结果归并起来. 即将数组进行分组, 分到最终无法再分(此时最有有两个元素), 再一一进行归并(进行两个数组每个元素之间进行比较)
时间复杂度: O(nlogn)
自顶向上的方法
/*
*@program: algStudy
*@description: 归并排序(自顶向上的方法)
*@author: chensy
*@create: 2019-07-17 21:38
*/
public class Merge
{
private static int[] aux;
public static void main(String[] args) {
int[] arr = doArrayTool.reverse(doArrayTool.create(10));
sort(arr);
doArrayTool.show(arr);
}
public static void sort(int[] a){
aux = new int[a.length];
sort(a, 0, a.length -1);
}
//将数组进行分组, 最终无法再分, 再一一进行归并
public static void sort(int[] a, int start, int end){
if(end <= start){
return;
}
int mid = start + (end - start) / 2;
sort(a, start, mid);
sort(a, mid + 1, end);
merge(a, start, mid, end);
}
//进行归并, 思路: 先用临时数组全存下来, 再进行左右两边元素对比, 哪个小哪个放入那个位置
public static void merge(int[] a, int start, int mid, int end){
//左边的开始
int left = start;
//右边的开始
int right = mid + 1;
//临时数组进行存储
for (int i = start; i <= end; i++) {
aux[i] = a[i];
}
//元素对比
for (int i = start; i <= end; i++) {
//这个是当左右两边比较, 左边比完时, 直接将右边加上来
if(start> mid) {
a[i] = aux[right++];
}
// 这个是右边比完时, 把左边加上来
else if (right > end) {
a[i] = aux[left++];
}
//比较两边, 如果右边小于左边, 将右边那个放入对应位置
else if (aux[right] < aux[left])
{
a[i] = aux[right++];
}
//这个就是右边大于左边啦
else {
a[i] = aux[left++];
}
}
}
}