1-
21## 题目地址(912. 排序数组)
2+
33https://leetcode-cn.com/problems/sort-an-array/
44
55## 题目描述
6+
67```
78给你一个整数数组 nums,请你将该数组升序排列。
89
@@ -44,19 +45,19 @@ https://leetcode-cn.com/problems/sort-an-array/
4445我们先来看题目的限制条件,这其实在选择算法的过程中是重要的。 看到这道题的时候,大脑就闪现出了各种排序算法,
4546这也算是一个复习` 排序算法 ` 的机会吧。
4647
47- 题目的限制条件是有两个,第一是元素个数不超过10k ,这个不算大。 另外一个是数组中的每一项范围都是` -50k ` 到` 50k ` (包含左右区间)。
48- 看到这里,基本我就排除了时间复杂度为O (n^2)的算法。
48+ 题目的限制条件是有两个,第一是元素个数不超过 10k ,这个不算大。 另外一个是数组中的每一项范围都是` -50k ` 到` 50k ` (包含左右区间)。
49+ 看到这里,基本我就排除了时间复杂度为 O (n^2)的算法。
4950
50- > 我没有试时间复杂度 O(n^2) 的解法,大家可以试一下,看是不是会TLE 。
51+ > 我没有试时间复杂度 O(n^2) 的解法,大家可以试一下,看是不是会 TLE 。
5152
52- 剩下的就是基于比较的` nlogn ` 算法,以及基于特定条件的O (n)算法。
53+ 剩下的就是基于比较的` nlogn ` 算法,以及基于特定条件的 O (n)算法。
5354
54- 由于平时很少用到` 计数排序 ` 等O (n)的排序算法,一方面是空间复杂度不是常量,另一方面是其要求数据范围不是很大才行,不然会浪费很多空间。
55- 但是这道题我感觉可以试一下。 在这里,我用了两种方法,一种是` 计数排序 ` ,一种是` 快速排序 ` 来解决。 大家也可以尝试用别的解法来解决。
55+ 由于平时很少用到` 计数排序 ` 等 O (n)的排序算法,一方面是空间复杂度不是常量,另一方面是其要求数据范围不是很大才行,不然会浪费很多空间。
56+ 但是这道题我感觉可以试一下。 在这里,我用了两种方法,一种是` 计数排序 ` ,一种是` 快速排序 ` 来解决。 大家也可以尝试用别的解法来解决。
5657
5758### 解法一 - 计数排序
5859
59- 时间复杂度O (n)空间复杂度O (m) m 为数组中值的取值范围,在这道题就是` 50000 * 2 + 1 ` 。
60+ 时间复杂度 O (n)空间复杂度 O (m) m 为数组中值的取值范围,在这道题就是` 50000 * 2 + 1 ` 。
6061
6162我们只需要准备一个数组取值范围的数字,然后遍历一遍,将每一个元素放到这个数组对应位置就好了,
6263放的规则是` 索引为数字的值,value为出现的次数 ` 。
@@ -65,12 +66,11 @@ https://leetcode-cn.com/problems/sort-an-array/
6566
6667![ sort-an-array-1] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghlu8a5bvij30mz0dedgw.jpg )
6768
68-
6969### 解法二 - 快速排序
7070
7171快速排序和归并排序都是分支思想来进行排序的算法, 并且二者都非常流行。 快速排序的核心点在于选择轴元素。
7272
73- 每次我们将数组分成两部分,一部分是比pivot (轴元素)大的,另一部分是不比pivot大的 。 我们不断重复这个过程,
73+ 每次我们将数组分成两部分,一部分是比 pivot (轴元素)大的,另一部分是不比 pivot 大的 。 我们不断重复这个过程,
7474直到问题的规模缩小的寻常(即只有一个元素的情况)。
7575
7676快排的核心点在于如何选择轴元素,一般而言,选择轴元素有三种策略:
@@ -80,86 +80,85 @@ https://leetcode-cn.com/problems/sort-an-array/
8080- 数组中间的元素(我采用的是这种,大家可以尝试下别的)
8181- 数组随机一项元素
8282
83-
8483![ sort-an-array-2] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghlu8b9s1vj30jj08oaau.jpg )
8584
8685(图片来自: https://www.geeksforgeeks.org/quick-sort/ )
8786
8887> 图片中的轴元素是最后面的元素,而提供的解法是中间元素,这点需要注意,但是这并不影响理解。
8988
90-
9189## 关键点解析
9290
9391- 排序算法
9492- 注意题目的限制条件从而选择合适的算法
9593
96-
9794## 代码
9895
9996计数排序:
10097
10198代码支持: JavaScript
99+
102100``` js
103101/**
104102 * @param {number[]} nums
105103 * @return {number[]}
106104 */
107- var sortArray = function (nums ) {
108- const counts = Array (50000 * 2 + 1 ).fill (0 );
109- const res = [];
110- for (const num of nums) counts[50000 + num] += 1 ;
111- for (let i in counts) {
112- while (counts[i]-- ) {
113- res .push (i - 50000 )
114- }
105+ var sortArray = function (nums ) {
106+ const counts = Array (50000 * 2 + 1 ).fill (0 );
107+ const res = [];
108+ for (const num of nums) counts[50000 + num] += 1 ;
109+ for (let i in counts) {
110+ while (counts[i]-- ) {
111+ res .push (i - 50000 );
115112 }
116- return res;
113+ }
114+ return res;
117115};
118116```
119117
120-
121118快速排序:
122119
123120代码支持: JavaScript
121+
124122``` js
125123function swap (nums , a , b ) {
126- const temp = nums[a];
127- nums[a] = nums[b];
128- nums[b] = temp;
124+ const temp = nums[a];
125+ nums[a] = nums[b];
126+ nums[b] = temp;
129127}
130128
131129function helper (nums , start , end ) {
132- if (start >= end) return ;
133- const pivotIndex = start + ((end - start) >>> 1 )
134- const pivot = nums[pivotIndex]
135- let i = start;
136- let j = end;
137- while (i <= j) {
138- while (nums[i] < pivot) i++ ;
139- while (nums[j] > pivot) j-- ;
140- if (i <= j) {
141- swap (nums, i, j);
142- i++ ;
143- j-- ;
144- }
130+ if (start >= end) return ;
131+ const pivotIndex = start + ((end - start) >>> 1 );
132+ const pivot = nums[pivotIndex];
133+ let i = start;
134+ let j = end;
135+ while (i <= j) {
136+ while (nums[i] < pivot) i++ ;
137+ while (nums[j] > pivot) j-- ;
138+ if (i <= j) {
139+ swap (nums, i, j);
140+ i++ ;
141+ j-- ;
145142 }
146- helper (nums, start, j);
147- helper (nums, i, end);
143+ }
144+ helper (nums, start, j);
145+ helper (nums, i, end);
148146}
149147
150148/**
151149 * @param {number[]} nums
152150 * @return {number[]}
153151 */
154- var sortArray = function (nums ) {
155- helper (nums, 0 , nums .length - 1 );
156- return nums;
152+ var sortArray = function (nums ) {
153+ helper (nums, 0 , nums .length - 1 );
154+ return nums;
157155};
158156```
159157
160158## 扩展
161159
162- - 你是否可以用其他方式排序算法解决
160+ - 你是否可以用其他方式排序算法解决?
161+ - 你可以使用同样的算法对链表进行排序么?(大家可以用力扣 ` 148.排序链表 ` 进行验证哦)
163162
164163## 参考
165164
0 commit comments