Skip to content

Commit 35ba1dc

Browse files
committed
添加归并排序
1 parent e13b5dd commit 35ba1dc

4 files changed

Lines changed: 137 additions & 35 deletions

File tree

notes/algorithms/基础排序算法.md

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -185,43 +185,75 @@ public class InsertionSort {
185185
186186
#### 4. 归并排序
187187

188+
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
189+
190+
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
191+
192+
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
193+
- 自下而上的迭代;
194+
188195
```
189-
//归并排序
190-
aux [n...mid..mid+1..m]
191-
nums [a,b,c,d,e,f,g]
192-
193-
194-
private void merge(int[] nums, int left, int mid, int right) {
195-
int[] aux = Arrays.copyOfRange(nums, left, right + 1);
196-
int i = left, j = mid + 1;
197-
for(int k = left; k <= right; k++) {
198-
if(i > mid) {
199-
nums[k] = aux[j - left];
200-
j++;
201-
} else if(j > right) {
202-
nums[k] = aux[i - left];
203-
i++;
204-
} else if(aux[i - left] < aux[j - left]) {
205-
nums[k] = aux[i - left];
206-
i++;
207-
} else {//aux[i-left] >= aux[j-left]
208-
nums[k] = aux[j - left];
209-
j++;
210-
}
211-
}
212-
}
213-
private void sort(int[] nums, int left, int right) {
214-
if(left >= right) {
215-
return;
216-
}
217-
int mid = (right - left) / 2 + left;
218-
sort(nums, left, mid);
219-
sort(nums, mid+1, right);
220-
merge(nums, left, mid, right);
221-
}
222-
public void sort(int[] nums) {
223-
sort(nums, 0, nums.length - 1);
196+
public class MergeSort {
197+
198+
/**
199+
*
200+
* 将arr[left...mid]和arr[mid+1...right]两部分进行归并
201+
*
202+
* @param arr
203+
* @param left
204+
* @param mid
205+
* @param right
206+
*/
207+
public static void merge(int[] arr, int left, int mid, int right) {
208+
int[] aux = Arrays.copyOfRange(arr, left, right + 1);
209+
210+
// i表示左边;j表示右边;
211+
int i = left, j = mid + 1;
212+
// 从左left遍历到右right, 左闭又开
213+
for (int k = left; k <= right; k++) {
214+
// 如果左边指针大于mid,则表示左半边数据已经归并完毕
215+
if (i > mid) {
216+
// j-left计算出相对aux的位置
217+
arr[k] = aux[j-left];
218+
j++;
219+
} else if (j > right) {
220+
// j大于right值,则表示右半边数据已经归并完毕
221+
arr[k] = aux[i-left];
222+
i++;
223+
} else if (aux[i-left] < aux[j-left]) {
224+
arr[k] = aux[i-left];
225+
i++;
226+
} else {
227+
arr[k] = aux[j-left];
228+
j++;
229+
}
230+
}
231+
}
232+
233+
/**
234+
*
235+
* 对[left, right]范围进行排序
236+
*
237+
* @param arr
238+
* @param left
239+
* @param right
240+
*/
241+
public static void sort(int[] arr, int left, int right) {
242+
if (left >= right) {
243+
return;
244+
}
245+
int mid = (left + right) / 2;
246+
sort(arr, left, mid);
247+
sort(arr, mid + 1, right);
248+
merge(arr, left, mid, right);
249+
}
250+
251+
public static void sort(int[] arr) {
252+
int n = arr.length;
253+
sort(arr, 0, n-1);
254+
}
224255
}
256+
225257
```
226258

227259

244 KB
Loading

notes/pictures/mergeSort.gif

326 KB
Loading
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.bruis.algorithminjava.algorithm.sort;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
*
7+
* 归并排序
8+
*
9+
* @author LuoHaiYang
10+
*/
11+
public class MergeSort {
12+
13+
/**
14+
*
15+
* 将arr[left...mid]和arr[mid+1...right]两部分进行归并
16+
*
17+
* @param arr
18+
* @param left
19+
* @param mid
20+
* @param right
21+
*/
22+
public static void merge(int[] arr, int left, int mid, int right) {
23+
int[] aux = Arrays.copyOfRange(arr, left, right + 1);
24+
25+
// i表示左边;j表示右边;
26+
int i = left, j = mid + 1;
27+
// 从左left遍历到右right, 左闭又开
28+
for (int k = left; k <= right; k++) {
29+
// 如果左边指针大于mid,则表示左半边数据已经归并完毕
30+
if (i > mid) {
31+
// j-left计算出相对aux的位置
32+
arr[k] = aux[j-left];
33+
j++;
34+
} else if (j > right) {
35+
// j大于right值,则表示右半边数据已经归并完毕
36+
arr[k] = aux[i-left];
37+
i++;
38+
} else if (aux[i-left] < aux[j-left]) {
39+
arr[k] = aux[i-left];
40+
i++;
41+
} else {
42+
arr[k] = aux[j-left];
43+
j++;
44+
}
45+
}
46+
}
47+
48+
/**
49+
*
50+
* 对[left, right]范围进行排序
51+
*
52+
* @param arr
53+
* @param left
54+
* @param right
55+
*/
56+
public static void sort(int[] arr, int left, int right) {
57+
if (left >= right) {
58+
return;
59+
}
60+
int mid = (left + right) / 2;
61+
sort(arr, left, mid);
62+
sort(arr, mid + 1, right);
63+
merge(arr, left, mid, right);
64+
}
65+
66+
public static void sort(int[] arr) {
67+
int n = arr.length;
68+
sort(arr, 0, n-1);
69+
}
70+
}

0 commit comments

Comments
 (0)