3月打卡活动第31天 LeetCode第912题:排序数组(中等)
- 题目:给定一个整数数组 nums,将该数组升序排列。
- 解题思路1:借着这道题复习一下排序方法吧。冒泡排序,依次从大到小确定。
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
for(int i=0;i<len;i++){
for(int j=0;j<len-1-i;j++){
if(nums[j]>nums[j+1]){
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
}

- 解题思路2:选择排序看来还是比冒泡要好呀,从小到大确定。
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
for(int i=0;i<len;i++){
int index = i;
for(int j=i+1;j<len;j++){
if(nums[j]<nums[index]){
index = j;
}
}
int temp = nums[index];
nums[index] = nums[i];
nums[i] = temp;
}
return nums;
}
}

- 解题思路3:插入排序,保持当前元素左侧始终是排序后的数组,依次确定当前数的位置。
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
for(int i=1;i<len;i++){
for(int j=i;j>0;j--){
if (nums[j]<nums[j-1]){
int temp=nums[j-1];
nums[j-1]=nums[j];
nums[j]=temp;
}else break;
}
}
return nums;
}
}

class Solution {
public int[] sortArray(int[] nums) {
int max = -50001, min = 50001;
for (int num: nums) {
max = Math.max(num, max);
min = Math.min(num, min);
}
int[] counter = new int[max - min + 1];
for (int num: nums) {
counter[num - min]++;
}
int idx = 0;
for (int num = min; num <= max; num++) {
int cnt = counter[num - min];
while (cnt-- > 0) {
nums[idx++] = num;
}
}
return nums;
}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/sort-an-array/solution/dang-wo-tan-pai-xu-shi-wo-zai-tan-xie-shi-yao-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

- 题解做法2:归并排序。归并排序是典型的使用分治思想(divide-and-conquer)解决问题的案例。在排序的过程中,把原来的数组变成左右两个数组,然后分别进行排序,当左右的子数组排序完毕之后,再合并这两个子数组形成一个新的排序数组。整个过程递归进行,当只剩下一个元素或者没有元素的时候就直接返回。
private void mergeSort(int[] nums, int left, int right) {
if (left >= right) return;
int mid = (left+right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid+1, right);
int[] temp = new int[right-left+1];
int i=left,j=mid+1;
int cur = 0;
while (i<=mid&&j<=right) {
if (nums[i]<=nums[j]) temp[cur] = nums[i++];
else temp[cur] = nums[j++];
cur++;
}
while (i<=mid) temp[cur++] = nums[i++];
while (j<=right) temp[cur++] = nums[j++];
for (int k = 0; k < temp.length; k++) {
nums[left+k] = temp[k];
}
}
作者:bryansun2020
链接:https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 题解做法3:快速排序,其核心的思路是取第一个元素(或者最后一个元素)作为分界点,把整个数组分成左右两侧,左边的元素小于或者等于分界点元素,而右边的元素大于分界点元素,然后把分界点移到中间位置,对左右子数组分别进行递归,最后就能得到一个排序完成的数组。当子数组只有一个或者没有元素的时候就结束这个递归过程。
private void quickSort(int[] nums, int left, int right) {
if (left >= right) return;
int lo = left+1;
int hi = right;
while (lo<=hi) {
if (nums[lo]>nums[left]) {
swap(nums, lo, hi);
hi--;
} else {
lo++;
}
}
lo--;
swap(nums, left, lo);
quickSort2(nums, left, lo-1);
quickSort2(nums, lo+1, right);
}
作者:bryansun2020
链接:https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
private void heapSort(int[] nums) {
heapify(nums);
for (int i = nums.length - 1; i >= 1; i--) {
swap(nums, 0, i);
rebuildHeap(nums, 0,i-1);
}
}
private void heapify(int[] nums) {
for (int i = 1; i < nums.length; i++) {
int par = (i-1)>>1;
int child = i;
while (child>0&&nums[par]<nums[child]) {
swap(nums, par, child);
child = par;
par = (par-1) >> 1;
}
}
}
private void rebuildHeap(int[] nums, int par, int last) {
int left = 2*par+1;
int right = 2*par+2;
int maxIndex = left;
if (right<=last && nums[right]>nums[left]) {
maxIndex = right;
}
if (left<=last && nums[par] < nums[maxIndex]) {
swap(nums, par, maxIndex);
rebuildHeap(nums, maxIndex, last);
}
}
作者:bryansun2020
链接:https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
private int[] bstSort(int[] nums) {
TreeNode root = new TreeNode(nums[0]);
for (int i = 1; i < nums.length; i++) {
buildTree(root, nums[i]);
}
inorderTraversal(root, nums, new int[1]);
return nums;
}
private void inorderTraversal(TreeNode node, int[] nums, int[] pos) {
if (node == null) return;
inorderTraversal(node.left, nums, pos);
nums[pos[0]++] = node.val;
inorderTraversal(node.right, nums, pos);
}
private void buildTree(TreeNode node, int num) {
if (node == null) return;
if (num >= node.val) {
if (node.right == null) {
node.right = new TreeNode(num);
} else {
buildTree(node.right, num);
}
} else {
if (node.left == null) {
node.left = new TreeNode(num);
} else {
buildTree(node.left, num);
}
}
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
作者:bryansun2020
链接:https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。