在工作中,常用的“选择排序”、“冒泡排序”、“插入排序”、“快速排序”这四种排序方式。
我试着用go语言编写一下这四种方式的实现。
假设我们有一个数组{3,2,5,1,4},从小到大排列
1.选择排序
实现
遍历数组,每次找出最小的元素即可。
func csort(a []int) {
for i := 0; i < len(a); i++ {
for j := i + 1; j < len(a); j++ {
if a[i] > a[j] {
a[i], a[j] = a[j], a[i]
}
}
}
}
func main(){
a:=[5]int{3,2,5,1,4}
sliceb:=a[:]
csort(sliceb)
fmt.Println(a)
}
推演思路
遍历 i=0时
选择初最小的数填充a[0]-第一个元素。交换a[0],a[3]
遍历i=1时
i=2时
i=3时
完成。
2.冒泡排序
实现
冒泡排序方式跟下一个相比较,比较的向后移动。第一次循环便利到最后,第二次遍历到len(a)-i(最后一个已经时最大的,没必要比较了)
func bsort(a []int){
for i:=0;i<len(a);i++{
for(j:=0;j<len(a)-i-1;j++){
if a[j]>a[j+1]{
a[j],a[j+1]=a[j+1],a[j]
}
}
}
}
func main(){
a:=[5]int{3,2,5,1,4}
sliceb:=a[:]
bsort(sliceb)
fmt.Println(a)
}
推演思路
i=0
i=1
i=2
i=3
3.插入排序
实现
快速排序法是在遍历数组时,先找前两位进行比较,根据最外层的循环逐渐扩大比对范围。
//插入排序
func isort(a []int){
for i:=0;i<len(a);i++{
for j:=i;j>=0;j--{
if a[j]>a[j++]{
a[j],a[j+1]=a[j+1],a[j]
}
}
}
}
func main(){
a:=[5]int{3,2,5,1,4}
sliceb:=a[:]
jsort(sliceb)
fmt.Println(a)
}
思路推演
i=0
i=1
i=2
i=3
4.快速排序
实现
快速排序法主题思想是递归,也就是利用通用的方法进行递归排序。
首先需要选出一个数作为比较的对象,我们姑且称之为比较数。
然后遍历数组,将比这个数小的放在数的左边,比这个数大的放在比较数的右边。
这样就分为左右两部分,我们将左右两边继续选择出一个数作为比较对象,重复先前的比对工作,直至边界(被分割数组长度小于1)
递归的边界我们姑且定位开始(left)结束(right),比较对象姑且定为第一个元素。
func qsort(a []int,left,right int){
if left>=right{
return
}
val:=a[left]
k:=left
for i:=left;i<right;i++{
if a[i]<val{
a[k]=a[i]
a[i]=a[k+1]
k++
a[k]=val
}
}
qsort(a,left,k-1)
qsort(a,k+1,right)
}
func main(){
a:=[5]int{3,2,5,1,4}
sliceb:=a[:]
qsort(sliceb,0,len(a)-1)
fmt.Println(a)
}
思路推演
根据第一个外层思路解释
i=0
i=1
i=2
i=3
下一层递归 qsort(a []int ,0,1) qsort(a []int ,3,4)
基本介绍完了。原创不易,还请多多点赞谢谢。