Skip to content

Commit 570962f

Browse files
Adding Shell Sort Sorting Algorithm (doocs#364)
* Adding ShellSort Algorithm * Updating Englisg READMEs' * Update README.md * Update ShellSort.js Co-authored-by: Abdullah Meda <am2024@hw.ac.uk> Co-authored-by: Yang Libin <contact@yanglibin.info>
1 parent 938f17d commit 570962f

File tree

6 files changed

+130
-1
lines changed

6 files changed

+130
-1
lines changed

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
3939
- [Selection Sort](/basic/sorting/SelectionSort/README.md)
4040
- [Merge Sort](/basic/sorting/MergeSort/README.md)
4141
- [Quick Sort](/basic/sorting/QuickSort/README.md)
42+
- [Shell Sort](/basic/sorting/ShellSort/README.md)
4243

4344
### Searching
4445

basic/README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- [Selection Sort](./sorting/SelectionSort/README.md)
88
- [Merge Sort](./sorting/MergeSort/README.md)
99
- [Quick Sort](./sorting/QuickSort/README.md)
10+
- [Shell Sort](./sorting/ShellSort/README.md)
1011

1112
## Searching
1213

basic/sorting/MergeSort/MergeSort.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ private static void merge(int[] nums, int low, int mid, int high, int[] temp) {
1616
}
1717
}
1818

19-
System.arraycopy(tmp, low, nums, low, high - low + 1);
19+
System.arraycopy(temp, low, nums, low, high - low + 1);
2020
}
2121

2222
private static void mergeSort(int[] nums, int low, int high, int[] temp) {

basic/sorting/ShellSort/README.md

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# 希尔排序
2+
3+
希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本。
4+
5+
- 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是因为待插入元素局部非常无序,比如说`[2, 3, 4, 5, 6, 7, 8, 1, ...]`,我们要插入 1,就必须将 1 和前面的 2-8 每个值都比较一下,就是因为 1 附近非常无序,想象一下,如果待插入元素附近比较有序,那么在进行插入排序的时候就只需要比较非常少的几次就可以插入到正确位置。
6+
- 希尔排序就是先把整个序列排得相对比较有序,再进行插入排序的时候,需要比较的次数就会变得很少。
7+
- 插入排序的增量(间隔)为 1,希尔排序相当于将这个间隔从最大为数组长度的一半一直降到 1,这一点在程序中体现的很清楚。当间隔很大时,比较的次数也会很少,在进行了几次大间隔的插入排序后,序列已经部分有序,这样再进行小间隔的插入排序也自然会比较很少的次数。
8+
- 希尔排序就是将处在相同间隔的元素提取出来单独进行插入排序,然后逐步将间隔减小到 1 的过程。
9+
10+
## 代码示例
11+
12+
<!-- tabs:start -->
13+
14+
### **Java**
15+
16+
```java
17+
import java.util.Arrays;
18+
19+
public class ShellSort {
20+
21+
private static int[] shellSort(int[] arr) {
22+
int n = arr.length;
23+
24+
for (int gap = n / 2; gap > 0; gap /= 2) {
25+
for (int i = gap; i < n; i++) {
26+
int key = arr[i];
27+
int j = i;
28+
while (j >= gap && arr[j - gap] > key) {
29+
arr[j] = arr[j - gap];
30+
j -= gap;
31+
}
32+
arr[j] = key;
33+
}
34+
}
35+
return arr;
36+
}
37+
38+
public static void main(String[] args) {
39+
System.out.println(Arrays.toString(shellSort(new int[]{1, 2, 7, 9, 5, 8})));
40+
}
41+
}
42+
```
43+
44+
### **JavaScript**
45+
46+
```javascript
47+
function shellSort(arr) {
48+
var len = arr.length;
49+
var gapSize = Math.floor(len / 2);
50+
while (gapSize > 0) {
51+
for (var i = gapSize; i < len; i++) {
52+
var temp = arr[i];
53+
var j = i;
54+
55+
while (j >= gapSize && arr[j - gapSize] > temp) {
56+
arr[j] = arr[j - gapSize];
57+
j -= gapSize;
58+
}
59+
arr[j] = temp;
60+
}
61+
gapSize = Math.floor(gapSize / 2);
62+
}
63+
return arr;
64+
}
65+
66+
let arr = [6, 3, 2, 1, 5];
67+
console.log(shellSort(arr));
68+
```
69+
70+
<!-- tabs:end -->
71+
72+
## 算法分析
73+
74+
时间复杂度:
75+
76+
希尔排序的时间性能取决于所取“增量”序列的函数,这涉及到一些数学上尚未解决的难题。但是有人通过大量的实验,给出了较好的结果:当 n 较大时,比较和移动的次数约在 `n^1.25``(1.6n)^1.25` 之间。所以可以这样简单记忆:
77+
78+
- 当 n 较小时,希尔排序和插入排序相差不大,都为 n² 左右。
79+
- 当 n 很大时,时间增长幅度逐渐放缓,平均复杂度是 nlogn。
80+
81+
空间复杂度:O(1)。
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.util.Arrays;
2+
3+
public class ShellSort {
4+
5+
private static int[] shellSort(int[] arr) {
6+
int n = arr.length;
7+
8+
for (int gap = n / 2; gap > 0; gap /= 2) {
9+
for (int i = gap; i < n; i++) {
10+
int key = arr[i];
11+
int j = i;
12+
while (j >= gap && arr[j - gap] > key) {
13+
arr[j] = arr[j - gap];
14+
j -= gap;
15+
}
16+
arr[j] = key;
17+
}
18+
}
19+
return arr;
20+
}
21+
22+
public static void main(String[] args) {
23+
System.out.println(Arrays.toString(shellSort(new int[]{1, 2, 7, 9, 5, 8})));
24+
}
25+
}

basic/sorting/ShellSort/ShellSort.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function shellSort(arr) {
2+
var len = arr.length;
3+
var gapSize = Math.floor(len / 2);
4+
while (gapSize > 0) {
5+
for (var i = gapSize; i < len; i++) {
6+
var temp = arr[i];
7+
var j = i;
8+
9+
while (j >= gapSize && arr[j - gapSize] > temp) {
10+
arr[j] = arr[j - gapSize];
11+
j -= gapSize;
12+
}
13+
arr[j] = temp;
14+
}
15+
gapSize = Math.floor(gapSize / 2);
16+
}
17+
return arr;
18+
}
19+
20+
let arr = [6, 3, 2, 1, 5];
21+
console.log(shellSort(arr))

0 commit comments

Comments
 (0)