排序-Java版

------------恢复内容开始------------

选择排序 O(N^2)

class Solution {
    public int[] sortArray(int[] nums) {
        int len = nums.length;
        for(int i = 0; i < len -1; i++){
            int minIndex = i;
            for(int j = i+ 1; j < len; j++){
                if (nums[j] <nums[minIndex]){
                    minIndex = j;
                } 
            }
            swap(nums, i, minIndex);
        }
        return nums;
    }
    private void swap(int[] nums, int index1, int index2) {
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }
}

插入排序: O(n^2)

class Solution {
    public int[] sortArray(int[] nums) {
        int len = nums.length;
        for (int i = 1; i <len; i++){
            int temp = nums[i];
            int j = i;
            while(j > 0 && nums[j-1] > temp){
                nums[j] = nums[j-1];
                j--;
            }
            nums[j] = temp;
        }
        return nums;
    }
}

归并排序 O(nlogn) O(n)

class Solution {
    private static final int INSERTION_SORT_THRESHOLD = 7;
    public int[] sortArray(int[] nums) {
        int len = nums.length;
        int [] temp = new int[len];
        mergeSort(nums,0,len -1 , temp);
        return nums;
    }
    private void mergeSort(int[] nums, int left, int right, int[] temp){
        if (right - left <= INSERTION_SORT_THRESHOLD){
            insertionSort(nums,left,right);
            return ;
        }
        int mid = left + (right - left) /2;
        mergeSort(nums,left,mid, temp);
        mergeSort(nums,mid +1, right, temp);
        if(nums[mid] <= nums[mid +1]){
            return;
        }
        mergeOfTwoSortedArray(nums,left,mid,right,temp);
    }
    private void insertionSort(int arr[], int left ,int right){
        for(int i = left +1 ; i <= right; i++){
            int temp = arr[i];
            int j= i;
            while(j>left && arr[j-1] > temp){
                arr[j] = arr[j-1];
                j--;
            }
            arr[j] = temp;
        }
    }
    private void mergeOfTwoSortedArray(int [] nums, int left, int mid, int right, int[] temp){
        System.arraycopy(nums,left,temp,left,right + 1 - left);
        int i = left;
        int j = mid + 1;
        for (int k =left; k <= right; k++){
            if(i == mid +1){
                nums[k] = temp[j];
                j++;
            }else if (j == right + 1){
                nums[k] = temp[i];
                i++;
            }else if (temp[i] <= temp[j]){
                nums[k] = temp[i];
                i++;
            }else{
                nums[k] = temp[j];
                j++;
            }
        }
    }
}

 

------------恢复内容结束------------

posted @ 2020-04-03 09:32  oldby  阅读(123)  评论(0编辑  收藏  举报