Skip to content

Commit f626e96

Browse files
committed
feat: add solutions to lc problem: No.0912
No.0912.Sort an Array
1 parent b9fe632 commit f626e96

File tree

5 files changed

+347
-179
lines changed

5 files changed

+347
-179
lines changed

solution/0900-0999/0912.Sort an Array/README.md

+156-83
Original file line numberDiff line numberDiff line change
@@ -89,31 +89,29 @@ class Solution:
8989
```python
9090
class Solution:
9191
def sortArray(self, nums: List[int]) -> List[int]:
92-
def merge_sort(nums, left, right):
93-
if left >= right:
92+
def merge_sort(l, r):
93+
if l >= r:
9494
return
95-
mid = (left + right) >> 1
96-
merge_sort(nums, left, mid)
97-
merge_sort(nums, mid + 1, right)
98-
i, j = left, mid + 1
95+
mid = (l + r) >> 1
96+
merge_sort(l, mid)
97+
merge_sort(mid + 1, r)
98+
i, j = l, mid + 1
9999
tmp = []
100-
while i <= mid and j <= right:
100+
while i <= mid and j <= r:
101101
if nums[i] <= nums[j]:
102102
tmp.append(nums[i])
103103
i += 1
104104
else:
105105
tmp.append(nums[j])
106106
j += 1
107-
while i <= mid:
108-
tmp.append(nums[i])
109-
i += 1
110-
while j <= right:
111-
tmp.append(nums[j])
112-
j += 1
113-
for i in range(left, right + 1):
114-
nums[i] = tmp[i - left]
115-
116-
merge_sort(nums, 0, len(nums) - 1)
107+
if i <= mid:
108+
tmp.extend(nums[i:mid + 1])
109+
if j <= r:
110+
tmp.extend(nums[j: r + 1])
111+
for i in range(l, r + 1):
112+
nums[i] = tmp[i - l]
113+
114+
merge_sort(0, len(nums) - 1)
117115
return nums
118116
```
119117

@@ -197,21 +195,24 @@ class Solution {
197195

198196
```java
199197
class Solution {
198+
private int[] nums;
199+
200200
public int[] sortArray(int[] nums) {
201-
mergeSort(nums, 0, nums.length - 1);
201+
this.nums = nums;
202+
mergeSort(0, nums.length - 1);
202203
return nums;
203204
}
204205

205-
private void mergeSort(int[] nums, int left, int right) {
206-
if (left >= right) {
206+
private void mergeSort(int l, int r) {
207+
if (l >= r) {
207208
return;
208209
}
209-
int mid = (left + right) >> 1;
210-
mergeSort(nums, left, mid);
211-
mergeSort(nums, mid + 1, right);
212-
int i = left, j = mid + 1, k = 0;
213-
int[] tmp = new int[right - left + 1];
214-
while (i <= mid && j <= right) {
210+
int mid = (l + r) >> 1;
211+
mergeSort(l, mid);
212+
mergeSort(mid + 1, r);
213+
int i = l, j = mid + 1, k = 0;
214+
int[] tmp = new int[r - l + 1];
215+
while (i <= mid && j <= r) {
215216
if (nums[i] <= nums[j]) {
216217
tmp[k++] = nums[i++];
217218
} else {
@@ -221,11 +222,11 @@ class Solution {
221222
while (i <= mid) {
222223
tmp[k++] = nums[i++];
223224
}
224-
while (j <= right) {
225+
while (j <= r) {
225226
tmp[k++] = nums[j++];
226227
}
227-
for (i = left; i <= right; ++i) {
228-
nums[i] = tmp[i - left];
228+
for (i = l; i <= r; ++i) {
229+
nums[i] = tmp[i - l];
229230
}
230231
}
231232
}
@@ -269,26 +270,35 @@ public:
269270
class Solution {
270271
public:
271272
vector<int> sortArray(vector<int>& nums) {
272-
merge_sort(nums, 0, nums.size() - 1);
273+
function<void(int, int)> merge_sort = [&](int l, int r) {
274+
if (l >= r) {
275+
return;
276+
}
277+
int mid = (l + r) >> 1;
278+
merge_sort(l, mid);
279+
merge_sort(mid + 1, r);
280+
int i = l, j = mid + 1, k = 0;
281+
int tmp[r - l + 1];
282+
while (i <= mid && j <= r) {
283+
if (nums[i] <= nums[j]) {
284+
tmp[k++] = nums[i++];
285+
} else {
286+
tmp[k++] = nums[j++];
287+
}
288+
}
289+
while (i <= mid) {
290+
tmp[k++] = nums[i++];
291+
}
292+
while (j <= r) {
293+
tmp[k++] = nums[j++];
294+
}
295+
for (i = l; i <= r; ++i) {
296+
nums[i] = tmp[i - l];
297+
}
298+
};
299+
merge_sort(0, nums.size() - 1);
273300
return nums;
274301
}
275-
276-
void merge_sort(vector<int>& nums, int left, int right) {
277-
if (left >= right) return;
278-
int mid = left + right >> 1;
279-
merge_sort(nums, left, mid);
280-
merge_sort(nums, mid + 1, right);
281-
int i = left, j = mid + 1, k = 0;
282-
vector<int> tmp(right - left + 1);
283-
while (i <= mid && j <= right)
284-
{
285-
if (nums[i] <= nums[j]) tmp[k++] = nums[i++];
286-
else tmp[k++] = nums[j++];
287-
}
288-
while (i <= mid) tmp[k++] = nums[i++];
289-
while (j <= right) tmp[k++] = nums[j++];
290-
for (i = left; i <= right; ++i) nums[i] = tmp[i - left];
291-
}
292302
};
293303
```
294304

@@ -302,12 +312,12 @@ func sortArray(nums []int) []int {
302312
return nums
303313
}
304314

305-
func quickSort(nums []int, left, right int) {
306-
if left >= right {
315+
func quickSort(nums []int, l, r int) {
316+
if l >= r {
307317
return
308318
}
309-
i, j := left-1, right+1
310-
x := nums[(left+right)>>1]
319+
i, j := l-1, r+1
320+
x := nums[(l+r)>>1]
311321
for i < j {
312322
for {
313323
i++
@@ -325,8 +335,8 @@ func quickSort(nums []int, left, right int) {
325335
nums[i], nums[j] = nums[j], nums[i]
326336
}
327337
}
328-
quickSort(nums, left, j)
329-
quickSort(nums, j+1, right)
338+
quickSort(nums, l, j)
339+
quickSort(nums, j+1, r)
330340
}
331341
```
332342

@@ -338,16 +348,16 @@ func sortArray(nums []int) []int {
338348
return nums
339349
}
340350

341-
func mergeSort(nums []int, left, right int) {
342-
if left >= right {
351+
func mergeSort(nums []int, l, r int) {
352+
if l >= r {
343353
return
344354
}
345-
mid := (left + right) >> 1
346-
mergeSort(nums, left, mid)
347-
mergeSort(nums, mid+1, right)
348-
i, j, k := left, mid+1, 0
349-
tmp := make([]int, right-left+1)
350-
for i <= mid && j <= right {
355+
mid := (l + r) >> 1
356+
mergeSort(nums, l, mid)
357+
mergeSort(nums, mid+1, r)
358+
i, j, k := l, mid+1, 0
359+
tmp := make([]int, r-l+1)
360+
for i <= mid && j <= r {
351361
if nums[i] <= nums[j] {
352362
tmp[k] = nums[i]
353363
i++
@@ -357,22 +367,85 @@ func mergeSort(nums []int, left, right int) {
357367
}
358368
k++
359369
}
360-
for i <= mid {
370+
for ; i <= mid; i++ {
361371
tmp[k] = nums[i]
362-
i++
363372
k++
364373
}
365-
for j <= right {
374+
for ; j <= r; j++ {
366375
tmp[k] = nums[j]
367-
j++
368376
k++
369377
}
370-
for i = left; i <= right; i++ {
371-
nums[i] = tmp[i-left]
378+
for i = l; i <= r; i++ {
379+
nums[i] = tmp[i-l]
372380
}
373381
}
374382
```
375383

384+
### **TypeScript**
385+
386+
快速排序:
387+
388+
```ts
389+
function sortArray(nums: number[]): number[] {
390+
function quickSort(l: number, r: number) {
391+
if (l >= r) {
392+
return;
393+
}
394+
let i = l - 1;
395+
let j = r + 1;
396+
const x = nums[(l + r) >> 1];
397+
while (i < j) {
398+
while (nums[++i] < x);
399+
while (nums[--j] > x);
400+
if (i < j) {
401+
[nums[i], nums[j]] = [nums[j], nums[i]];
402+
}
403+
}
404+
quickSort(l, j);
405+
quickSort(j + 1, r);
406+
}
407+
const n = nums.length;
408+
quickSort(0, n - 1);
409+
return nums;
410+
}
411+
```
412+
413+
归并排序:
414+
415+
```ts
416+
function sortArray(nums: number[]): number[] {
417+
function mergetSort(l: number, r: number) {
418+
if (l >= r) {
419+
return;
420+
}
421+
const mid = (l + r) >> 1;
422+
mergetSort(l, mid);
423+
mergetSort(mid + 1, r);
424+
let [i, j, k] = [l, mid + 1, 0];
425+
while (i <= mid && j <= r) {
426+
if (nums[i] <= nums[j]) {
427+
tmp[k++] = nums[i++];
428+
} else {
429+
tmp[k++] = nums[j++];
430+
}
431+
}
432+
while (i <= mid) {
433+
tmp[k++] = nums[i++];
434+
}
435+
while (j <= r) {
436+
tmp[k++] = nums[j++];
437+
}
438+
for (i = l, j = 0; i <= r; ++i, ++j) {
439+
nums[i] = tmp[j];
440+
}
441+
}
442+
const n = nums.length;
443+
let tmp = new Array(n).fill(0);
444+
mergetSort(0, n - 1);
445+
return nums;
446+
}
447+
```
448+
376449
### **JavaScript**
377450

378451
快速排序:
@@ -383,22 +456,22 @@ func mergeSort(nums []int, left, right int) {
383456
* @return {number[]}
384457
*/
385458
var sortArray = function (nums) {
386-
function quickSort(left, right) {
387-
if (left >= right) {
459+
function quickSort(l, r) {
460+
if (l >= r) {
388461
return;
389462
}
390-
let i = left - 1;
391-
let j = right + 1;
392-
const x = nums[(left + right) >> 1];
463+
let i = l - 1;
464+
let j = r + 1;
465+
const x = nums[(l + r) >> 1];
393466
while (i < j) {
394467
while (nums[++i] < x);
395468
while (nums[--j] > x);
396469
if (i < j) {
397470
[nums[i], nums[j]] = [nums[j], nums[i]];
398471
}
399472
}
400-
quickSort(left, j);
401-
quickSort(j + 1, right);
473+
quickSort(l, j);
474+
quickSort(j + 1, r);
402475
}
403476
const n = nums.length;
404477
quickSort(0, n - 1);
@@ -414,15 +487,15 @@ var sortArray = function (nums) {
414487
* @return {number[]}
415488
*/
416489
var sortArray = function (nums) {
417-
function mergetSort(left, right) {
418-
if (left >= right) {
490+
function mergetSort(l, r) {
491+
if (l >= r) {
419492
return;
420493
}
421-
const mid = (left + right) >> 1;
422-
mergetSort(left, mid);
423-
mergetSort(mid + 1, right);
424-
let [i, j, k] = [left, mid + 1, 0];
425-
while (i <= mid && j <= right) {
494+
const mid = (l + r) >> 1;
495+
mergetSort(l, mid);
496+
mergetSort(mid + 1, r);
497+
let [i, j, k] = [l, mid + 1, 0];
498+
while (i <= mid && j <= r) {
426499
if (nums[i] <= nums[j]) {
427500
tmp[k++] = nums[i++];
428501
} else {
@@ -432,10 +505,10 @@ var sortArray = function (nums) {
432505
while (i <= mid) {
433506
tmp[k++] = nums[i++];
434507
}
435-
while (j <= right) {
508+
while (j <= r) {
436509
tmp[k++] = nums[j++];
437510
}
438-
for (i = left, j = 0; i <= right; ++i, ++j) {
511+
for (i = l, j = 0; i <= r; ++i, ++j) {
439512
nums[i] = tmp[j];
440513
}
441514
}

0 commit comments

Comments
 (0)