@@ -29,17 +29,17 @@ function checkArray(arr) {
29
29
export function bubbleSort ( array ) {
30
30
const arr = array . slice ( ) ;
31
31
checkArray ( arr ) ;
32
- let hasSwap = false ;
32
+ if ( arr . length < 2 ) return arr ;
33
+
33
34
for ( let i = arr . length - 1 ; i > 0 ; i -- ) {
35
+ let swapped = false ;
34
36
for ( let j = 0 ; j < i ; j ++ ) {
35
37
if ( arr [ j ] > arr [ j + 1 ] ) {
36
38
swap ( arr , j , j + 1 ) ;
37
- hasSwap = true ;
39
+ swapped = true ;
38
40
}
39
41
}
40
- if ( ! hasSwap ) {
41
- return arr ;
42
- }
42
+ if ( ! swapped ) return arr ;
43
43
}
44
44
return arr ;
45
45
}
@@ -58,10 +58,12 @@ export function bubbleSort(array) {
58
58
export function selectionSort ( array ) {
59
59
const arr = array . slice ( ) ;
60
60
checkArray ( arr ) ;
61
+ if ( arr . length < 2 ) return arr ;
62
+
61
63
for ( let i = 0 ; i < arr . length - 1 ; i ++ ) {
62
64
let min = i ;
63
65
for ( let j = i + 1 ; j < arr . length ; j ++ ) {
64
- if ( arr [ min ] >= arr [ j ] ) {
66
+ if ( arr [ min ] > arr [ j ] ) {
65
67
min = j ;
66
68
}
67
69
}
@@ -87,14 +89,17 @@ export function selectionSort(array) {
87
89
export function insertionSort ( array ) {
88
90
const arr = array . slice ( ) ;
89
91
checkArray ( arr ) ;
92
+ if ( arr . length < 2 ) return arr ;
93
+
90
94
for ( let i = 1 ; i < arr . length ; i ++ ) {
91
- let cur = i ;
92
- const curVal = arr [ cur ] ;
93
- while ( cur > 0 && arr [ cur - 1 ] > curVal ) {
94
- arr [ cur ] = arr [ cur - 1 ] ;
95
- cur -= 1 ;
95
+ let j = i ;
96
+ const toInsert = arr [ j ] ;
97
+ while ( j > 0 && arr [ j - 1 ] > toInsert ) {
98
+ // compare all prev items with the one to insert until find the position to insert
99
+ arr [ j ] = arr [ j - 1 ] ;
100
+ j -= 1 ;
96
101
}
97
- arr [ cur ] = curVal ;
102
+ arr [ j ] = toInsert ;
98
103
}
99
104
return arr ;
100
105
}
@@ -114,6 +119,9 @@ export function insertionSort(array) {
114
119
*/
115
120
export function shellSort ( array , base = 3 ) {
116
121
const arr = array . slice ( ) ;
122
+ checkArray ( arr ) ;
123
+ if ( arr . length < 2 ) return arr ;
124
+
117
125
const len = arr . length ;
118
126
let gap = 1 ;
119
127
@@ -153,12 +161,11 @@ export function shellSort(array, base = 3) {
153
161
export function quickSortWithArray ( array ) {
154
162
const arr = array . slice ( ) ;
155
163
checkArray ( arr ) ;
156
- if ( arr . length < 2 ) {
157
- return arr ;
158
- }
164
+ if ( arr . length < 2 ) return arr ;
165
+
159
166
const [ pivot , ...rest ] = arr ;
160
167
const larger = rest . filter ( ( item ) => item > pivot ) ;
161
- const smaller = rest . filter ( ( item ) => item <= pivot ) ;
168
+ const smaller = rest . filter ( ( item ) => item <= pivot ) ; // includes items equal to pivot
162
169
163
170
return [ ...quickSortWithArray ( smaller ) , pivot , ...quickSortWithArray ( larger ) ] ;
164
171
}
@@ -178,7 +185,7 @@ export function quickSortWithArray(array) {
178
185
*/
179
186
export function quickSort ( array , lo = 0 , hi = array . length ) {
180
187
checkArray ( array ) ;
181
- if ( array . length <= 1 || hi <= lo ) return array ;
188
+ if ( array . length < 2 || hi - 1 <= lo ) return array ;
182
189
183
190
const partition = ( arr , left , right ) => {
184
191
let i = left ;
@@ -234,7 +241,7 @@ export function mergeSort(array) {
234
241
return result . concat ( left . slice ( i ) , right . slice ( j ) ) ;
235
242
} ;
236
243
237
- const mid = Math . floor ( arr . length / 2 ) ;
244
+ const mid = Math . floor ( arr . length / 2 ) ; // be aware that it's not `arr.length - 1`
238
245
return merge ( mergeSort ( arr . slice ( 0 , mid ) ) , mergeSort ( arr . slice ( mid ) ) ) ;
239
246
}
240
247
@@ -280,4 +287,4 @@ export function heapSort(array) {
280
287
}
281
288
282
289
return arr ;
283
- }
290
+ }
0 commit comments