简单排序--归并排序,快速排序

归并排序以及快速排序

针对于数据量大的排序,一般不会采用冒泡,选择,插入等时间复杂度为O(n²)的,效率上太慢;一般使用归并排序和快速排序时间复杂度为O(nlogn)

快速排序

采用分治的思想进行排序,以一个基准值(pivot)先区分出 area < pivot 的部分 和 area > pivot的部分,然后在进行排序,是一种自上而下的思想,它的处理过程是由上到下的,先分区,然后再处理子问题,是不稳定的

private void quickSort(int[] arr){
    if (arr.length <= 1){
        return;
    }
    // 针对每个部分进行排序
    quickSort(arr,0,arr.length - 1);
}

private void quickSort(int[] arr,int low,int high){
    if (low < high){
        // 进行分区,获得两部分数据
        int pivot = patition(arr,low,high);
        quickSort(arr,low,pivot - 1);
        quickSort(arr,pivot + 1,high);
    }
}

private int patition(int[] arr,int low,int high){
    // 基准值
    int pivot = arr[low];
    while(low < high){
        while (low < high && pivot <= arr[high]) {
            -- high;
        }
        arr[low] = arr[high];
        while (low < high && pivot >= arr[low] ){
            ++ low;
        }
        arr[high] = arr[low];
    }
    arr[low] = pivot;
    return low;
}

归并排序

也是采用分治的思想进行排序,由下到上的,先处理子问题,然后再合并,是一种自下而上的思想,是稳定的,但是额外的使用了空间O(n),主要原因是合并函数无法在原地执行

 private void mergeSort(int[] arr){
        mergeSort(arr,0,arr.length - 1);
    }

    private void mergeSort(int[] arr, int low, int high) {
        int mid = ( low + high ) / 2;
        if(low < high){
            mergeSort(arr,low,mid);
            mergeSort(arr,mid + 1,high);
            merge(arr,low,high,mid);
        }
    }

    private void merge(int[] arr, int low, int high, int mid) {
        int[] temp = new int[high - low + 1];
        int i = low,j = mid + 1,k = 0;
        while(i <= mid && j <= high){
            if (arr[i] < arr[j]){
                temp[k ++] = arr[i ++];
            }else{
                temp[k ++] = arr[j ++ ];
            }
        }
        while (i <= mid){
            temp [k ++] = arr[i ++ ];
        }
        while (j <= high){
            temp [k ++] = arr[j ++];
        }
        for (int l = 0; l < temp.length; l++) {
            arr[l + low] = temp[l];
        }
    }

未完。。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务