“同学你是做什么的?”
“Java”
“你呢?”
“C#”
“那你呢?”
“我是GoLang”

为啥程序员要用语言来划分?


起因

最新在重温C语言,这玩意从学校出来后就没再用过了,重温的时候找算法题来练练手感,正好练习到了快速排序,就准备用C语言实现一下,但是在获取子数组引用的时候无从下手了,memcpy函数只是从内存地址拷贝一个新数组出来,跟原来的数组并没有引用关系了,这就很麻烦了,一时间断了思绪,第二天起来晨跑后,茅塞顿开,GoLang的切片不正好是子数组的引用么(改了子数组原始数组也会改变),然后迅速用GoLang实现了一下,果然,前辈们都说程序员不要限制在某种语言里,要打开思路,在适合的场景下用适合的语言才是王道。

贴一下GoLang的快排实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main

import (
"fmt"
)

func main() {
array := []int{8, 7, 6, 1, 0, 9, 2}
sort(array)
for i, v := range array {
fmt.Printf("i:%d,v:%d\n", i, v)
}
}

func sort(array []int) {
len := len(array)
if (len <= 1) {
return
}
pivot := array[len-1]
pointer2 := -1
flagMax := true
for i := 0; i < len; i++ {
if array[i] > pivot && flagMax {
pointer2 = i
flagMax = false
continue
}

if pointer2 >= 0 && array[i] < pivot {
swap(array, pointer2, i)
flagMax = true
i = pointer2
pointer2 = -1
continue
}

// 找到比pivot大的,但是没找到比pivot小的
if i >= len-2 && pointer2 >= 0 {
swap(array, pointer2, len-1)
flagMax = true

// subarray of left
sort(array[0:pointer2])

// subarray of right
sort(array[pointer2+1 : len])
}

// 没找到比pivot大的,说明pivot是最大数,那么它的位置不变,递归subarray(0,len-1)的子数组
if i >= len-2 && pointer2 < 0 {
flagMax = true
if len > 2 {
sort(array[0 : len-1])
}
}
}
}

func swap(array []int, first int, secode int) {
tmp := array[first]
array[first] = array[secode]
array[secode] = tmp
}


本文作者:oldmee
本文链接:https://oldmee.github.io/2023/07/29/quick-sort-again/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。