【LeetCode】912. 排序数组
题目链接:
题目描述:
给你一个整数数组 nums
,将该数组升序排列。
示例:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000
思路:
没什么可说的,非常朴实无华的一道题,比那些花里胡哨的强多了
class Solution {
public int[] sortArray(int[] nums) {
// 方法一:系统方法
// Arrays.sort(nums);
// return nums;
// 方法二:冒泡排序(超出时间限制)
// bubbleSort(nums);
// return nums;
// 方法三:桶排序
return bucketSort(nums);
// 方法四:选择排序
// selectionSort(nums);
// return nums;
// 方法五:插入排序
// insertionSort(nums);
// return nums;
}
/**
* 冒泡排序
* @param nums
*/
private void bubbleSort(int[] nums) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
}
}
}
}
/**
* 桶排序
* @param nums
* @return
*/
private int[] bucketSort(int[] nums) {
// 题目:-50000 <= nums[i] <= 50000
int[] count = new int[100001];
// 统计每个数字出现的次数
for (int num : nums) {
count[num + 50000] ++;
}
ArrayList<Integer> list = new ArrayList<>(nums.length);
for (int i = 0; i < count.length; i++) {
if (count[i] != 0) {
for (int j = 0; j < count[i]; j++) {
list.add(i - 50000);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
/**
* 选择排序
* @param nums
*/
private void selectionSort(int[] nums) {
for (int i = nums.length - 1; i > 0; i--) {
// 最大元素的位置
int maxIndex = 0;
for (int j = 0; j <= i; j++) {
if (nums[maxIndex]<nums[j]) {
maxIndex = j;
}
}
// 把这个最大的元素移到最后
swap(nums, maxIndex, i);
}
}
/**
* 插入排序
* @param nums
*/
private void insertionSort(int[] nums) {
// 从第二个元素开始遍历
for (int i = 1; i < nums.length; i++) {
int j = i;
// 将当前元素移动到合适的位置
while (j > 0 && nums[j] < nums[j - 1]) {
swap(nums, j, j - 1);
j--;
}
}
}
/**
* 交换数组中两个元素
* @param nums 数组
* @param i 元素索引
* @param j 元素索引
*/
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
少一些功利主义的追求,多一些不为什么的坚持