10.13经典算法总结

本文详细介绍了两种经典的排序算法——归并排序和快速排序。归并排序通过递归将数组分为两半,然后合并已排序的子数组。快速排序则采用分治策略,选取基准值并重新排列数组,将数组不断划分为较小和较大的部分,直至所有元素有序。这两种算法在实际应用中各有优势,理解其工作原理对于优化算法性能至关重要。

1.归并算法

class Solution {
    int[] temp;
    public int[] sortArray(int[] nums) {
        temp = new int[nums.length];
        mergeSort(nums,0,nums.length-1);
        return nums;
    }
    //归并排序
    //表明对数组nums中区间[left,right]中的元素排序
    public void mergeSort(int[] nums,int left,int right){
        if(left >= right){
            return;
        }
        int mid = left + (right-left)/2;
        //首先最左右分区进行排序
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        //将排好序的子区间合并在temp数组中
        int i = left;
        int j = mid+1;
        int index = 0;
        while(i <= mid && j <= right){
            if(nums[i] <= nums[j]){
                temp[index] = nums[i++];
            }else{
                temp[index] = nums[j++];
            }
            index++;
        }
        while(i <= mid){
            temp[index] = nums[i];
            index++;
            i++;
        }
        while(j <= right){
            temp[index] = nums[j];
            index++;
            j++;
        }
        //将临时数组中的元素放回nums数组中
        for(i = left;i <= right;i++){
            //细节问题:temp临时数组每次使用都是从0开始储存,而nums则是从left到right
            nums[i] = temp[i-left];
        }
    }
}

2.快速排序

class Solution {
    public int[] sortArray(int[] nums) {
        int n=nums.length;
        quickSort(nums,0,n-1);
        return nums;
    }

    public void quickSort(int[] arr,int left,int right){
        if(left>right)return;
        if(arr==null&&arr.length==0)return;
        int key=arr[left];
        int l=left;
        int r=right;
        while(l!=r){
            //注意从右边先开始
            while(key<=arr[right])r--;
            while(key>=arr[left])l++;
            if(l<r){
                int temp=arr[l];
                arr[l]=arr[r];
                arr[r]=temp;
            }
        }
        arr[left]=arr[l];
        arr[l]=key;
        quickSort(arr,left,l-1);
        quickSort(arr,l+1,right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值