• 912. Sort an Array


    Given an array of integers nums, sort the array in ascending order.

    Example 1:

    Input: [5,2,3,1]
    Output: [1,2,3,5]
    

    Example 2:

    Input: [5,1,1,2,0,0]
    Output: [0,0,1,1,2,5]
    

    Note:

    1. 1 <= A.length <= 10000
    2. -50000 <= A[i] <= 50000

    参考 https://www.cnblogs.com/fatttcat/p/10058544.html

    M1: Selection Sort, time = O(n^2), space = O(1), not stable

    class Solution {
        public int[] sortArray(int[] nums) {
            if(nums == null || nums.length == 0) {
                return nums;
            }
            for(int i = 0; i < nums.length; i++) {
                int minIdx = i;
                for(int j = i + 1; j < nums.length; j++) {
                    if(nums[j] < nums[minIdx]) {
                        minIdx = j;
                    }
                }
                int tmp = nums[i];
                nums[i] = nums[minIdx];
                nums[minIdx] = tmp;
            }
            return nums;
        }
    }

    M2: Merge Sort, time = O(nlogn), space = O(n), stable

    class Solution {
        public int[] sortArray(int[] nums) {
            if(nums == null || nums.length == 0) {
                return nums;
            }
            int[] helper = new int[nums.length];
            mergeSort(nums, helper, 0, nums.length - 1);
            return nums;
        }
        
        private void mergeSort(int[] nums, int[] helper, int left, int right) {
            if(left >= right) {
                return;
            }
            int mid = left + (right - left) / 2;
            mergeSort(nums, helper, left, mid);
            mergeSort(nums, helper, mid + 1, right);
            merge(nums, helper, left, mid, right);
        }
        
        private void merge(int[] nums, int[] helper, int left, int mid, int right) {
            for(int i = left; i <= right; i++) {
                helper[i] = nums[i];
            }
            int p1 = left, p2 = mid + 1, p = left;
            while(p1 <= mid && p2 <= right) {
                if(helper[p1] <= helper[p2]) {
                    nums[p++] = helper[p1++];
                } else {
                    nums[p++] = helper[p2++];
                }
            }
            while(p1 <= mid) {
                nums[p++] = helper[p1++];
            }
            while(p2 <= right) {
                nums[p++] = helper[p2++];
            }
        }
    }

    M3: Quick Sort, average time = O(nlogn), worst time = O(n^2), space = O(logn), not stable

    class Solution {
        public int[] sortArray(int[] nums) {
            if(nums == null || nums.length == 0) {
                return nums;
            }
            quickSort(nums, 0, nums.length - 1);
            return nums;
        }
        
        public void quickSort(int[] nums, int left, int right) {
            if(left >= right) {
                return;
            }
            Random r = new Random();
            int pivot_idx = left + r.nextInt(right - left + 1);
            int pivot = nums[pivot_idx];
            swap(nums, pivot_idx, right);
            int i = left, j = right - 1;
            while(i <= j) {
                if(nums[i] < pivot) {
                    i++;
                } else {
                    swap(nums, i, j--);
                }
            }
            swap(nums, i, right);
            
            quickSort(nums, left, i - 1);
            quickSort(nums, i + 1, right);
        }
        
        public void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }
  • 相关阅读:
    Module build failed: TypeError: this.getResolve is not a function 安装node-sass运行报错
    RMAN Catalog 和 Nocatalog 的区别
    oracle 闪回区故障
    mysql windows 安装 错误
    git rejected
    oracle 计算机改名后监听无法启动
    mysql GTID
    java程序员技术范围
    activiti
    spring mybatis mysql 事务不起作用
  • 原文地址:https://www.cnblogs.com/fatttcat/p/11103239.html
Copyright © 2020-2023  润新知