|
1 | 1 | //Package sorts a package for demonstrating sorting algorithms in Go
|
2 | 2 | package sorts
|
3 | 3 |
|
4 |
| -import ( |
5 |
| - "math/rand" |
6 |
| -) |
7 |
| - |
8 |
| -func QuickSort(arr []int) []int { |
9 |
| - |
10 |
| - if len(arr) <= 1 { |
11 |
| - return arr |
| 4 | +func Quicksort(array []int) { |
| 5 | + if len(array) <= 1 { |
| 6 | + return |
12 | 7 | }
|
| 8 | + q := partition(array) |
| 9 | + Quicksort(array[:q]) |
| 10 | + Quicksort(array[q+1:]) |
| 11 | +} |
13 | 12 |
|
14 |
| - median := arr[rand.Intn(len(arr))] |
15 |
| - |
16 |
| - lowPart := make([]int, 0, len(arr)) |
17 |
| - highPart := make([]int, 0, len(arr)) |
18 |
| - middlePart := make([]int, 0, len(arr)) |
19 |
| - |
20 |
| - for _, item := range arr { |
21 |
| - switch { |
22 |
| - case item < median: |
23 |
| - lowPart = append(lowPart, item) |
24 |
| - case item == median: |
25 |
| - middlePart = append(middlePart, item) |
26 |
| - case item > median: |
27 |
| - highPart = append(highPart, item) |
| 13 | +func partition(array []int) int { |
| 14 | + r := len(array) - 1 |
| 15 | + x := array[r] // last element of slice |
| 16 | + i := -1 |
| 17 | + for j := 0; j < r; j++ { |
| 18 | + if array[j] <= x { |
| 19 | + i++ |
| 20 | + array[i], array[j] = array[j], array[i] |
28 | 21 | }
|
29 | 22 | }
|
30 |
| - |
31 |
| - lowPart = QuickSort(lowPart) |
32 |
| - highPart = QuickSort(highPart) |
33 |
| - |
34 |
| - lowPart = append(lowPart, middlePart...) |
35 |
| - lowPart = append(lowPart, highPart...) |
36 |
| - |
37 |
| - return lowPart |
| 23 | + array[i+1], array[r] = array[r], array[i+1] |
| 24 | + return i + 1 |
38 | 25 | }
|
0 commit comments