Skip to content

Commit 6954cf8

Browse files
corningsunhustcc
authored andcommitted
增加 Java 实现 (#16)
* 增加 Java 实现 * 精简Java代码目录结构,去掉包名
1 parent 438b902 commit 6954cf8

26 files changed

+1206
-3
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ _book
1515
*.mobi
1616
*.pdf
1717
\.idea/
18+
19+
*.iml
20+
21+
src/javaSortTest/target/

1.bubbleSort.md

+33
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,36 @@ func bubbleSort(arr []int) []int {
7777
return arr
7878
}
7979
```
80+
81+
## 8. Java 代码实现
82+
83+
```java
84+
public class BubbleSort implements IArraySort {
85+
86+
@Override
87+
public int[] sort(int[] sourceArray) throws Exception {
88+
// 对 arr 进行拷贝,不改变参数内容
89+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
90+
91+
for (int i = 1; i < arr.length; i++) {
92+
// 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
93+
boolean flag = true;
94+
95+
for (int j = 0; j < arr.length - i; j++) {
96+
if (arr[j] > arr[j + 1]) {
97+
int tmp = arr[j];
98+
arr[j] = arr[j + 1];
99+
arr[j + 1] = tmp;
100+
101+
flag = false;
102+
}
103+
}
104+
105+
if (flag) {
106+
break;
107+
}
108+
}
109+
return arr;
110+
}
111+
}
112+
```

10.radixSort.md

+86-1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,89 @@ function radixSort(arr, maxDigit) {
4747
}
4848
return arr;
4949
}
50-
```
50+
```
51+
52+
## 4. Java 代码实现
53+
54+
```java
55+
/**
56+
* 基数排序
57+
* 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9
58+
*/
59+
public class RadixSort implements IArraySort {
60+
61+
@Override
62+
public int[] sort(int[] sourceArray) throws Exception {
63+
// 对 arr 进行拷贝,不改变参数内容
64+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
65+
66+
int maxDigit = getMaxDigit(arr);
67+
return radixSort(arr, maxDigit);
68+
}
69+
70+
/**
71+
* 获取最高位数
72+
*/
73+
private int getMaxDigit(int[] arr) {
74+
int maxValue = getMaxValue(arr);
75+
return getNumLenght(maxValue);
76+
}
77+
78+
private int getMaxValue(int[] arr) {
79+
int maxValue = arr[0];
80+
for (int value : arr) {
81+
if (maxValue < value) {
82+
maxValue = value;
83+
}
84+
}
85+
return maxValue;
86+
}
87+
88+
protected int getNumLenght(long num) {
89+
if (num == 0) {
90+
return 1;
91+
}
92+
int lenght = 0;
93+
for (long temp = num; temp != 0; temp /= 10) {
94+
lenght++;
95+
}
96+
return lenght;
97+
}
98+
99+
private int[] radixSort(int[] arr, int maxDigit) {
100+
int mod = 10;
101+
int dev = 1;
102+
103+
for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
104+
// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
105+
int[][] counter = new int[mod * 2][0];
106+
107+
for (int j = 0; j < arr.length; j++) {
108+
int bucket = ((arr[j] % mod) / dev) + mod;
109+
counter[bucket] = arrayAppend(counter[bucket], arr[j]);
110+
}
111+
112+
int pos = 0;
113+
for (int[] bucket : counter) {
114+
for (int value : bucket) {
115+
arr[pos++] = value;
116+
}
117+
}
118+
}
119+
120+
return arr;
121+
}
122+
123+
/**
124+
* 自动扩容,并保存数据
125+
*
126+
* @param arr
127+
* @param value
128+
*/
129+
private int[] arrayAppend(int[] arr, int value) {
130+
arr = Arrays.copyOf(arr, arr.length + 1);
131+
arr[arr.length - 1] = value;
132+
return arr;
133+
}
134+
}
135+
```

2.selectionSort.md

+34
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,37 @@ func selectionSort(arr []int) []int {
7171
return arr
7272
}
7373
```
74+
75+
## 6. Java 代码实现
76+
77+
```java
78+
public class SelectionSort implements IArraySort {
79+
80+
@Override
81+
public int[] sort(int[] sourceArray) throws Exception {
82+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
83+
84+
// 总共要经过 N-1 轮比较
85+
for (int i = 0; i < arr.length - 1; i++) {
86+
int min = i;
87+
88+
// 每轮需要比较的次数 N-i
89+
for (int j = i + 1; j < arr.length; j++) {
90+
if (arr[j] < arr[min]) {
91+
// 记录目前能找到的最小值元素的下标
92+
min = j;
93+
}
94+
}
95+
96+
// 将找到的最小值和i位置所在的值进行交换
97+
if (i != min) {
98+
int tmp = arr[i];
99+
arr[i] = arr[min];
100+
arr[min] = tmp;
101+
}
102+
103+
}
104+
return arr;
105+
}
106+
}
107+
```

3.insertionSort.md

+34
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,37 @@ func insertionSort(arr []int) []int {
6565
return arr
6666
}
6767
```
68+
69+
## 6. Java 代码实现
70+
71+
```java
72+
public class InsertSort implements IArraySort {
73+
74+
@Override
75+
public int[] sort(int[] sourceArray) throws Exception {
76+
// 对 arr 进行拷贝,不改变参数内容
77+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
78+
79+
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
80+
for (int i = 1; i < arr.length; i++) {
81+
82+
// 记录要插入的数据
83+
int tmp = arr[i];
84+
85+
// 从已经排序的序列最右边的开始比较,找到比其小的数
86+
int j = i;
87+
while (j > 0 && tmp < arr[j - 1]) {
88+
arr[j] = arr[j - 1];
89+
j--;
90+
}
91+
92+
// 存在比其小的数,插入
93+
if (j != i) {
94+
arr[j] = tmp;
95+
}
96+
97+
}
98+
return arr;
99+
}
100+
}
101+
```

4.shellSort.md

+33
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,36 @@ func shellSort(arr []int) []int {
8787
return arr
8888
}
8989
```
90+
91+
## 5. Java 代码实现
92+
93+
```java
94+
public class ShellSort implements IArraySort {
95+
96+
@Override
97+
public int[] sort(int[] sourceArray) throws Exception {
98+
// 对 arr 进行拷贝,不改变参数内容
99+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
100+
101+
int gap = 1;
102+
while (gap < arr.length) {
103+
gap = gap * 3 + 1;
104+
}
105+
106+
while (gap > 0) {
107+
for (int i = gap; i < arr.length; i++) {
108+
int tmp = arr[i];
109+
int j = i - gap;
110+
while (j >= 0 && arr[j] > tmp) {
111+
arr[j + gap] = arr[j];
112+
j -= gap;
113+
}
114+
arr[j + gap] = tmp;
115+
}
116+
gap = (int) Math.floor(gap / 3);
117+
}
118+
119+
return arr;
120+
}
121+
}
122+
```

5.mergeSort.md

+50
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,53 @@ func merge(left []int, right []int) []int {
136136
return result
137137
}
138138
```
139+
140+
## 7. Java 代码实现
141+
142+
```java
143+
public class MergeSort implements IArraySort {
144+
145+
@Override
146+
public int[] sort(int[] sourceArray) throws Exception {
147+
// 对 arr 进行拷贝,不改变参数内容
148+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
149+
150+
if (arr.length < 2) {
151+
return arr;
152+
}
153+
int middle = (int) Math.floor(arr.length / 2);
154+
155+
int[] left = Arrays.copyOfRange(arr, 0, middle);
156+
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
157+
158+
return merge(sort(left), sort(right));
159+
}
160+
161+
protected int[] merge(int[] left, int[] right) {
162+
int[] result = new int[left.length + right.length];
163+
int i = 0;
164+
while (left.length > 0 && right.length > 0) {
165+
if (left[0] <= right[0]) {
166+
result[i++] = left[0];
167+
left = Arrays.copyOfRange(left, 1, left.length);
168+
} else {
169+
result[i++] = right[0];
170+
right = Arrays.copyOfRange(right, 1, right.length);
171+
}
172+
}
173+
174+
while (left.length > 0) {
175+
result[i++] = left[0];
176+
left = Arrays.copyOfRange(left, 1, left.length);
177+
}
178+
179+
while (right.length > 0) {
180+
result[i++] = right[0];
181+
right = Arrays.copyOfRange(right, 1, right.length);
182+
}
183+
184+
return result;
185+
}
186+
187+
}
188+
```

6.quickSort.md

+46-1
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,54 @@ func swap(arr []int, i, j int) {
177177
void QuickSort(int A[], int low, int high) //快排母函数
178178
{
179179
if (low < high) {
180-
int pivot = Paritition1(A, low, high);
180+
int pivot = Paritition1(A, low, high);
181181
QuickSort(A, low, pivot - 1);
182182
QuickSort(A, pivot + 1, high);
183183
}
184184
}
185185
```
186+
187+
## 7. Java 代码实现
188+
189+
```java
190+
public class QuickSort implements IArraySort {
191+
192+
@Override
193+
public int[] sort(int[] sourceArray) throws Exception {
194+
// 对 arr 进行拷贝,不改变参数内容
195+
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
196+
197+
return quickSort(arr, 0, arr.length - 1);
198+
}
199+
200+
private int[] quickSort(int[] arr, int left, int right) {
201+
if (left < right) {
202+
int partitionIndex = partition(arr, left, right);
203+
quickSort(arr, left, partitionIndex - 1);
204+
quickSort(arr, partitionIndex + 1, right);
205+
}
206+
return arr;
207+
}
208+
209+
private int partition(int[] arr, int left, int right) {
210+
// 设定基准值(pivot)
211+
int pivot = left;
212+
int index = pivot + 1;
213+
for (int i = index; i <= right; i++) {
214+
if (arr[i] < arr[pivot]) {
215+
swap(arr, i, index);
216+
index++;
217+
}
218+
}
219+
swap(arr, pivot, index - 1);
220+
return index - 1;
221+
}
222+
223+
private void swap(int[] arr, int i, int j) {
224+
int temp = arr[i];
225+
arr[i] = arr[j];
226+
arr[j] = temp;
227+
}
228+
229+
}
230+
```

0 commit comments

Comments
 (0)