归并排序

43 阅读1分钟

归并排序,主要思想:把两个有序数组,组合成一个大的有序数组。

如何获取一个有序数组,可以通过分治,把数组所有元素分成一个元素,那就是有序的,然后合并。就这样完成了

如下所示,往下递归分成有序数列,然后往上合并成一个有序数列。

复杂度:nO(logn)

(FG

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-9,78,0,23,-567,70};
        int[] temp = new int[arr.length];
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }


    public static void quickSort(int[] arr,int left,int right){
        if (left >= right){
            return;
        }
        int mid = left + (right - left)/2;
        quickSort(arr,left,mid);
        quickSort(arr,mid+1,right);

        //合并两个有序数组
        int length = 0;//表示辅助空间有多少元素
        int i_start = left;
        int i_end = mid;
        int j_start = mid + 1;
        int j_end = right;
        int[] temp = new int[j_end - i_start + 1];
        while (i_start <= i_end && j_start <= j_end){
            if (arr[i_start] < arr[j_start]){
                temp[length] = arr[i_start];
                i_start++;
                length++;
            }else{
                temp[length] = arr[j_start];
                j_start++;
                length++;
            }
        }

        //把右边多出来的数组全部加入到临时数组后面。由于数组有序,所以最大
        while(j_start <= j_end){
            temp[length++] = arr[j_start++];
        }
        //左边
        while(i_start <= i_end){
            temp[length++] = arr[i_start++];
        }

        //把最终的结果复制给原数组
        for (int i = 0; i < temp.length; i++) {
            arr[left + i] = temp[i];
        }
    }
}