ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手撕快排与归并

2022-03-20 14:58:38  阅读:128  来源: 互联网

标签:归并 right temp nums int ++ 快排 left


快速排序代码

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {2,3,5,11,2,3,8,6,6,6};
        System.out.println(Arrays.toString(quickSort(arr, 0, arr.length - 1)));
    }

    public static int[] quickSort(int[] nums, int left, int right) {
        int l = left;
        int r = right;
        int pivot = nums[(l + r) / 2];
        while (l < r) {
            while (nums[l] < pivot) {
                l++;
            }
            while ((nums[r] > pivot)) {
                r--;
            }
            if(l >= r) {
                break;
            }
            int temp = nums[r];
            nums[r] = nums[l];
            nums[l] = temp;
            if (nums[r] == pivot) {
                r--;
            }
            if (nums[l] == pivot) {
                l++;
            }
        }
        if (l == r) {
            l++;
            r--;
        }
        if (left < r) {
            quickSort(nums, left, r);
        }
        if (l < right) {
            quickSort(nums, l, right);
        }
        return nums;
    }
}

归并排序

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {2,3,5,11,2,3,8,6,6,6};
        int[] temp = new int[arr.length];
        merge(arr,0 , arr.length - 1, temp);
        System.out.println(Arrays.toString(arr));
    }
    public static long[] merge(int[] nums, int left, int right, int[] temp) {
        if (left < right) {
            int mid = (left + right) / 2;
            merge(nums, left, mid, temp);
            merge(nums, mid + 1, right, temp);
            // 向左递归
            mergeSort(nums, left, right, mid, temp);
        }
        return new long[0];
    }
    public static void mergeSort(int[] nums, int left, int right, int mid, int[] temp) {
        int i = left;
        int j = mid + 1;
        int t = 0;
        // 拆分数组到另一个数组中
        while (i <= mid && j <= right) {
            if (nums[i] < nums[j]) {
                temp[t] = nums[i];
                t++;
                i++;
            } else {
                temp[t] = nums[j];
                t++;
                j++;
            }
        }
        // 将原数组中剩余的数据添加到 temp 数组
        while (i <= mid) {
            temp[t] = nums[i];
            t++;
            i++;
        }
        while (j <= right) {
            temp[t] = nums[j];
            t++;
            j++;
        }

        // 将临时数组 copy 到原来的数组
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right) {
            nums[tempLeft] = temp[t];
            tempLeft++;
            t++;
        }
    }
}

标签:归并,right,temp,nums,int,++,快排,left
来源: https://blog.csdn.net/qq_45726143/article/details/123613127

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有