Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 682115d

Browse files
corningsunidsbllp
authored andcommitted
增加 Java 实现 (hustcc#16)
* 增加 Java 实现 * 精简Java代码目录结构,去掉包名
1 parent 475af27 commit 682115d

26 files changed

+1206
-3
lines changed

‎.gitignore

Lines changed: 4 additions & 0 deletions
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

Lines changed: 33 additions & 0 deletions
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

Lines changed: 86 additions & 1 deletion
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

Lines changed: 34 additions & 0 deletions
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

Lines changed: 34 additions & 0 deletions
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

Lines changed: 33 additions & 0 deletions
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

Lines changed: 50 additions & 0 deletions
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

Lines changed: 46 additions & 1 deletion
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)

AltStyle によって変換されたページ (->オリジナル) /