[路飞]_912. 排序数组

112 阅读1分钟

题目地址

题目描述

给你一个整数数组 nums,请你将该数组升序排列。
示例 1:

输入: nums = [5,2,3,1]
输出: [1,2,3,5]

示例 2:

输入: nums = [5,1,1,2,0,0]
输出: [0,0,1,1,2,5]

解题思路1

  • 排序方法sort:对数组的元素进行排序

代码1

var sortArray = function(nums){
    return nums.sort((a, b) => a - b);
}

解题思路2

  • 快速排序,先选择一个基准值
  • 然后选择左右两个指针,分别向中间移动
  • 把小于基准值的数放在左边,大于基准值的数放在右边
  • 递归上述操作

代码2

var sortArray = function(nums){
    quick(nums. 0, nums.length - 1);
    return nums;
}

var quick = function(arr, l, r){
    // 如果左指针的值大于右指针的值,那么就结束本次操作
    if(l >= r) return ;
    // 随意选择一个基准值,就选择数组的第一位
    let x = l, y = r, base = arr[l];
    while(x < y) {
        // 如果左指针小于右指针,且右指针的值大于基准值,那么不交换,右指针左移
        while(x < y && arr[y] >= base) y--;
        // 右指针遇到小于基准值的时候,先赋值后x++,
        if(x < y) arr[x++] = arr[y];
        while(x < y && arr[x] < base) x++;
        if(x < y) arr[y--] = arr[x];
    }
    // 将基准值放到中间位置
    arr[x] = base;
    quick(arr, l, x - 1);
    quick(arr, x + 1, y);
    return;
}

解题思路3

  • 单边递归法

代码3

var sortArray = function(nums) {
    quick(nums, 0, nums.length - 1);
    return nums;
};

var quick = function(arr, l, r){
    // 左边递归右边循环
    while(l < r) {
        let x = l, y = r, base = arr[l];
        while(x < y) {
            while(x < y && arr[y] >= base) y--;
            if(x < y) arr[x++] = arr[y];
            while(x < y && arr[x] < base) x++;
            if(x < y) arr[y--] = arr[x];
        }
        arr[x] = base;
        quick(arr, x + 1, r);
        r = x - 1;
    }
    return;
}