Skip to content

Commit 0fb1ee5

Browse files
committed
feat: add solutions to lc problem: No.0912
No.0912.Sort an Array
1 parent adc0b0e commit 0fb1ee5

File tree

8 files changed

+230
-130
lines changed

8 files changed

+230
-130
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
- [准时到达的列车最小时速](/solution/1800-1899/1870.Minimum%20Speed%20to%20Arrive%20on%20Time/README.md) - 二分查找
3939
- [找到需要补充粉笔的学生编号](/solution/1800-1899/1894.Find%20the%20Student%20that%20Will%20Replace%20the%20Chalk/README.md) - 二分查找
4040
- [可移除字符的最大数目](/solution/1800-1899/1898.Maximum%20Number%20of%20Removable%20Characters/README.md) - 二分查找
41+
- [排序数组](/solution/0900-0999/0912.Sort%20an%20Array/README.md) - 快速排序、归并排序
4142
<!-- 排序算法、待补充 -->
4243

4344
### 2. 搜索

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
3737
- [Minimum Speed to Arrive on Time](/solution/1800-1899/1870.Minimum%20Speed%20to%20Arrive%20on%20Time/README_EN.md) - Binary search
3838
- [Find the Student that Will Replace the Chalk](/solution/1800-1899/1894.Find%20the%20Student%20that%20Will%20Replace%20the%20Chalk/README_EN.md) - Binary search
3939
- [Maximum Number of Removable Characters](/solution/1800-1899/1898.Maximum%20Number%20of%20Removable%20Characters/README_EN.md) - Binary search
40+
- [Sort an Array](/solution/0900-0999/0912.Sort%20an%20Array/README_EN.md) - Quick Sort, Merge Sort
4041

4142
### 2. Search
4243

basic/sorting/MergeSort/Main.cpp

+25-64
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,35 @@
11
#include <iostream>
2-
#include <vector>
32

43
using namespace std;
54

6-
void printvec( const vector<int> &vec, const string &strbegin = "", const string &strend = "" )
7-
{
8-
cout << strbegin << endl;
9-
for ( auto val : vec )
10-
{
11-
cout << val << "\t";
12-
}
13-
14-
cout << endl;
15-
cout << strend << endl;
16-
}
5+
const int N = 1e6 + 10;
176

7+
int n;
8+
int nums[N];
9+
int tmp[N];
1810

19-
void mergesort( vector<int> & vec, int left, int right )
11+
void merge_sort(int nums[], int left, int right)
2012
{
21-
if ( left >= right )
22-
{
23-
return;
24-
}
25-
26-
int mid = left + (right - left) / 2;
27-
mergesort( vec, left, mid );
28-
mergesort( vec, mid + 1, right );
29-
30-
int i = left;
31-
int j = mid + 1;
32-
int k = 0;
33-
vector<int> vecTmp;
34-
while ( i <= mid && j <= right )
35-
{
36-
if ( vec[i] < vec[j] )
37-
{
38-
vecTmp.push_back( vec[i] );
39-
i++;
40-
}else {
41-
vecTmp.push_back( vec[j] );
42-
j++;
43-
}
44-
}
45-
46-
while ( i <= mid )
47-
{
48-
vecTmp.push_back( vec[i] );
49-
i++;
50-
}
51-
52-
while ( j <= right )
53-
{
54-
vecTmp.push_back( vec[j] );
55-
j++;
56-
}
57-
58-
for ( int i = left; i <= right; i++ )
59-
{
60-
vec[i] = vecTmp[i - left];
61-
}
62-
63-
return;
13+
if (left >= right) return;
14+
int mid = (left + right) >> 1;
15+
merge_sort(nums, left, mid);
16+
merge_sort(nums, mid + 1, right);
17+
int i = left, j = mid + 1, k = 0;
18+
while (i <= mid && j <= right)
19+
{
20+
if (nums[i] <= nums[j]) tmp[k++] = nums[i++];
21+
else tmp[k++] = nums[j++];
22+
}
23+
while (i <= mid) tmp[k++] = nums[i++];
24+
while (j <= right) tmp[k++] = nums[j++];
25+
for (i = left, j = 0; i <= right; ++i, ++j) nums[i] = tmp[j];
6426
}
6527

66-
67-
int main( void )
28+
int main()
6829
{
69-
vector<int> vec = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
70-
printvec( vec );
71-
mergesort( vec, 0, vec.size() - 1 );
72-
printvec( vec, "after insert sort" );
73-
return(0);
74-
}
30+
int n;
31+
scanf("%d", &n);
32+
for (int i = 0; i < n; ++i) scanf("%d", &nums[i]);
33+
merge_sort(nums, 0, n - 1);
34+
for (int i = 0; i < n; ++i) printf("%d ", nums[i]);
35+
}

basic/sorting/MergeSort/Main.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ public static void main(String[] args) {
1111
nums[i] = sc.nextInt();
1212
}
1313
mergeSort(nums, 0, n - 1);
14-
for (int i = 0; i < n; ++i) {
15-
System.out.printf("%d ", nums[i]);
14+
for (int x : nums) {
15+
System.out.print(x + " ");
1616
}
1717
}
1818

1919
public static void mergeSort(int[] nums, int left, int right) {
2020
if (left >= right) {
2121
return;
2222
}
23-
int mid = (left + right) >>> 1;
23+
int mid = (left + right) >> 1;
2424
mergeSort(nums, left, mid);
2525
mergeSort(nums, mid + 1, right);
2626
int i = left, j = mid + 1, k = 0;
@@ -30,6 +30,7 @@ public static void mergeSort(int[] nums, int left, int right) {
3030
} else {
3131
tmp[k++] = nums[j++];
3232
}
33+
3334
}
3435
while (i <= mid) {
3536
tmp[k++] = nums[i++];

basic/sorting/MergeSort/README.md

+22-61
Original file line numberDiff line numberDiff line change
@@ -276,78 +276,39 @@ func main() {
276276

277277
```cpp
278278
#include <iostream>
279-
#include <vector>
280279

281280
using namespace std;
282281

283-
void printvec( const vector<int> &vec, const string &strbegin = "", const string &strend = "" )
284-
{
285-
cout << strbegin << endl;
286-
for ( auto val : vec )
287-
{
288-
cout << val << "\t";
289-
}
282+
const int N = 1e6 + 10;
290283

291-
cout << endl;
292-
cout << strend << endl;
293-
}
284+
int n;
285+
int nums[N];
286+
int tmp[N];
294287

295-
296-
void mergesort( vector<int> & vec, int left, int right )
288+
void merge_sort(int nums[], int left, int right)
297289
{
298-
if ( left >= right )
299-
{
300-
return;
301-
}
302-
303-
int mid = left + (right - left) / 2;
304-
mergesort( vec, left, mid );
305-
mergesort( vec, mid + 1, right );
306-
307-
int i = left;
308-
int j = mid + 1;
309-
int k = 0;
310-
vector<int> vecTmp;
311-
while ( i <= mid && j <= right )
312-
{
313-
if ( vec[i] < vec[j] )
314-
{
315-
vecTmp.push_back( vec[i] );
316-
i++;
317-
}else {
318-
vecTmp.push_back( vec[j] );
319-
j++;
320-
}
321-
}
322-
323-
while ( i <= mid )
324-
{
325-
vecTmp.push_back( vec[i] );
326-
i++;
327-
}
328-
329-
while ( j <= right )
330-
{
331-
vecTmp.push_back( vec[j] );
332-
j++;
333-
}
334-
335-
for ( int i = left; i <= right; i++ )
290+
if (left >= right) return;
291+
int mid = (left + right) >> 1;
292+
merge_sort(nums, left, mid);
293+
merge_sort(nums, mid + 1, right);
294+
int i = left, j = mid + 1, k = 0;
295+
while (i <= mid && j <= right)
336296
{
337-
vec[i] = vecTmp[i - left];
297+
if (nums[i] <= nums[j]) tmp[k++] = nums[i++];
298+
else tmp[k++] = nums[j++];
338299
}
339-
340-
return;
300+
while (i <= mid) tmp[k++] = nums[i++];
301+
while (j <= right) tmp[k++] = nums[j++];
302+
for (i = left, j = 0; i <= right; ++i, ++j) nums[i] = tmp[j];
341303
}
342304

343-
344-
int main( void )
305+
int main()
345306
{
346-
vector<int> vec = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
347-
printvec( vec );
348-
mergesort( vec, 0, vec.size() - 1 );
349-
printvec( vec, "after insert sort" );
350-
return(0);
307+
int n;
308+
scanf("%d", &n);
309+
for (int i = 0; i < n; ++i) scanf("%d", &nums[i]);
310+
merge_sort(nums, 0, n - 1);
311+
for (int i = 0; i < n; ++i) printf("%d ", nums[i]);
351312
}
352313
```
353314

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

+78-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43-
- 快速排序
44-
- 归并排序
43+
**方法一:快速排序**
44+
45+
**方法二:归并排序**
46+
47+
以上两种方法时间复杂度均为 O(nlogn)。
4548

4649
<!-- tabs:start -->
4750

@@ -320,6 +323,79 @@ func mergeSort(nums []int, left, right int) {
320323
}
321324
```
322325

326+
### **JavaScript**
327+
328+
快速排序:
329+
330+
```js
331+
/**
332+
* @param {number[]} nums
333+
* @return {number[]}
334+
*/
335+
var sortArray = function (nums) {
336+
function quickSort(left, right) {
337+
if (left >= right) {
338+
return;
339+
}
340+
let i = left - 1;
341+
let j = right + 1;
342+
const x = nums[(left + right) >> 1];
343+
while (i < j) {
344+
while (nums[++i] < x);
345+
while (nums[--j] > x);
346+
if (i < j) {
347+
[nums[i], nums[j]] = [nums[j], nums[i]];
348+
}
349+
}
350+
quickSort(left, j);
351+
quickSort(j + 1, right);
352+
}
353+
const n = nums.length;
354+
quickSort(0, n - 1);
355+
return nums;
356+
};
357+
```
358+
359+
归并排序:
360+
361+
```js
362+
/**
363+
* @param {number[]} nums
364+
* @return {number[]}
365+
*/
366+
var sortArray = function (nums) {
367+
function mergetSort(left, right) {
368+
if (left >= right) {
369+
return;
370+
}
371+
const mid = (left + right) >> 1;
372+
mergetSort(left, mid);
373+
mergetSort(mid + 1, right);
374+
let [i, j, k] = [left, mid + 1, 0];
375+
while (i <= mid && j <= right) {
376+
if (nums[i] <= nums[j]) {
377+
tmp[k++] = nums[i++];
378+
} else {
379+
tmp[k++] = nums[j++];
380+
}
381+
}
382+
while (i <= mid) {
383+
tmp[k++] = nums[i++];
384+
}
385+
while (j <= right) {
386+
tmp[k++] = nums[j++];
387+
}
388+
for (i = left, j = 0; i <= right; ++i, ++j) {
389+
nums[i] = tmp[j];
390+
}
391+
}
392+
const n = nums.length;
393+
let tmp = new Array(n).fill(0);
394+
mergetSort(0, n - 1);
395+
return nums;
396+
};
397+
```
398+
323399
### **...**
324400

325401
```

0 commit comments

Comments
 (0)