排序算法

排序

快速排序

快速排序是排序算法中平均时间复杂度为O(nlogn)的一种算法。

思路:

从数组中选择一个数字,使得该数字左面都是小于该数字的数,右面都是大于该数字的数。再分别对该数字的左半部分和右半部分分别执行这种操作,直到数组区间中只剩一个数字,即可得到有序数列。

当数组本身有序时,时间复杂度会达到O(n^2),因为选择的主元没有把当前区间切分为两个长度差别不大的区间。

实现:

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        quickSort(arr, 0, arr.length - 1);
        return arr;
    }
    private void quickSort(int[] arr, int l, int r){
        if(l>=r) return;
        int i = partition(arr, l, r);
        quickSort(arr, l, i - 1);
        quickSort(arr, i + 1, r);
    }
    private int partition(int[] arr, int l, int r){
        int temp = arr[l];
        while(l < r){
            while(l < r && arr[r] >= temp){
                r--;
            }
            arr[l] = arr[r];
            while(l < r && arr[l] <= temp){
                l++;
            }
            arr[r] = arr[l];
        }
        arr[l] = temp;
        return l;
    }
}

相关题目: 排序

归并排序

归并排序是一种稳定的时间复杂度为O(nlogn)的排序算法。

思路:

一个数组的左半部分是有序的,右半部分也是有序的,通过从两端头开始比较可得到一个完整的有序数组。

实现:

public void mergeSort(int[] arr, int l, int r, int[] temp){
        if(l >= r) return;
        int mid = (l + r) >> 1;
        mergeSort(arr, l, mid, temp);
        mergeSort(arr, mid + 1, r, temp);
        int i = l, j = mid + 1;
        int idx = l;
        while(i <= mid && j <= r){
            if(arr[i] <= arr[j]){
                temp[idx++] = arr[i++];
            }else{
                temp[idx++] = arr[j++];
            }
        }
        while(i <= mid){
            temp[idx++] = arr[i++];
        }
        while(j <= r){
            temp[idx++] = arr[j++];
        }
        for(i = l; i < idx; i++){
            arr[i] = temp[i];
        }
    }

注意:分界点是mid和mid+1,不要多次创建temp数组,创建对象的开销特别大。