常见排序算法[java实现](面试常考排序算法)

常见排序算法[java实现](由难到易)

912. 排序数组

快排

  • partition

    • 若以起点l为分界线,循环结束r0的含义是从左到右,第一个大于分界线l的下标,交换(l,r0),并返回下标

    • 注意点

      • left需要保留,含义是分界线的下标

  • swap

class Solution {
    // 快排
    public int[] sortArray(int[] nums) {
        return quickSort(nums,0,nums.length-1);
    }
    int[] quickSort(int[] nums, int left, int right)
    {
        partition(nums,left,right);
        return nums;
    }
    int partition(int[] nums,int left,int right)
    {
        if(left>right) return -1;
        int l=left,r=right,divi=nums[l];
        while(true)
        {
            while(l<=r && nums[l]<=divi) l++;
            while(l<=r && nums[r]>divi) r--;
            if(l>r) break;
            swap(nums,l,r);
        }
        swap(nums,left,r);
        partition(nums,left,r-1);
        partition(nums,r+1,right);
        return r;
    }
    void swap(int[] nums,int l,int r)
    {
        int temp = nums[l];
        nums[l] = nums[r];
        nums[r] = temp;
    }
}

912. 排序数组

归并

  • sort

  • merge(永远记得,单个函数,就事论事,不干跨权限的事情)

    • 例如最后数组拷贝,起点是left,不是0

    • 例如本次合并,界限为right,不是n-1

class Solution {
    // 归并排序
    public int[] sortArray(int[] nums) {
        return sort(nums,0,nums.length-1);
    }
    public int[] sort(int[] nums,int l,int r)
    {
        if(l<r)
        {
            int mid = (l+r)/2;
            sort(nums,l,mid);
            sort(nums,mid+1,r);
            merge(nums,l,r,mid);
        }
        return nums;
    }
    void merge(int[] nums,int left,int right,int mid)
    {
        int oldL = left;
        // System.out.println(Arrays.toString(nums)+ " coming l="+left+" r="+right);
        int l = left,r=mid+1;
        int[] temp = new int[right-left+1];
        int k = 0;
        while(l<=mid && r<=right)
        {
            if(nums[l]<nums[r])
            {
                temp[k++] = nums[l++];
            }else{
                temp[k++] = nums[r++];
            }
        }
        while(l<=mid) temp[k++] = nums[l++];
        while(r<=right) temp[k++] = nums[r++];
        for(int i=0;i<k;i++)
        {
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值