Go语言的冒泡排序算法以及分治法求出逆序数_冒泡排序可以分治法吗

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

return cnt

}

func main() {
arr := []int{5, 3, 6, 2, 1, 4}
arr2 := bubbleSort(arr)
fmt.Printf(“%v的逆序数:%v\n”, arr, arr2)
}



> 
> [5 3 6 2 1 4]的逆序数:10  
> 
> 
> 


### Go分治法求逆序数


冒泡法虽然简单直观,但是其时间复杂度比较高 :**O(n^2)**。  
 我们先来看一个快速但比较复杂点的计算方法是在归并排序的同时计算逆序数,采用分治法其时间复杂度为**O(nlogn)** C++版本:[高级排序求逆序数之分治法](https://bbs.csdn.net/topics/618545628) 可以看出分治法其实属于递归变化的一种高级排序。  
 使用Golang语言来实现,这里我们将使用到切片类型,代码如下:



package main

import (
“fmt”
)

func merge_count(A []int, B []int) (int, []int) {
/*
合并且做了排序并统计逆序数
A列表的值大于B列表的值,就做统计,将B的值(小)添加到C列表
A列表的值小于B列表的值,就将A的值(小)添加到C列表
A和B列表是递归切割出来的
比较剩余之后的值添加到C列表
*/
lenA := len(A)
lenB := len(B)
i := 0
j := 0
rC := 0
var C []int
for i < lenA && j < lenB {
if A[i] > B[j] {
C = append(C, B[j])
j += 1
rC += lenA - i
} else {
C = append(C, A[i])
i += 1
}
}
if i < lenA {
C = append(C, A[i:]…) //切片添加元素需要解包
}
if j < lenB {
C = append(C, B[j:]…)
}
return rC, C
}

func sort_count(L []int) (int, []int) {
/*
递归的切割,然后做合并
*/
if len(L) == 1 {
return 0, L
} else {
rA, A := sort_count(L[0 : len(L)/2])
rB, B := sort_count(L[len(L)/2:])
rC, C := merge_count(A, B) //想明白程序的运行,这里可以做个断点查看
return rA + rB + rC, C
}
}
func main() {
//A := []int{5, 3, 6, 2, 1, 4}
A := []int{11, 5, 3, 6, 2, 9, 1, 4}
fmt.Printf(“%v”, A)
cnt, arr := sort_count(A)
fmt.Printf(“的逆序数:%v,%v”, cnt, arr)
}



> 
> 
> 
> [5 3 6 2 1 4]的逆序数:10,[1 2 3 4 5 6]
> 
> 
> [11 5 3 6 2 9 1 4]的逆序数:19,[1 2 3 4 5 6 9 11]
> 
> 
> 


### Python分治法求逆序数


对Golang不是很了解其语法的,可以先看下Python的方法,思想都是一样的,也就是说算法跟语言没有关系,不同的语言主要在于语法的区别,看个人的习惯。  
 这里用到的是列表,所以数据结构和算法还是核心,需要慢慢积累,另外不同语言的语法就是靠平时写代码过程中的注意和备注



def merge_count(A,B):
‘’’
合并且做了排序并统计逆序数
A列表的值大于B列表的值,就做统计,将B的值(小)添加到C列表
A列表的值小于B列表的值,就将A的值(小)添加到C列表
A和B列表是递归切割出来的
比较剩余之后的值添加到C列表
‘’’
lenA,lenB=len(A),len(B)
i,j,rC=0,0,0
C=[]
while(i<lenA and j<lenB):
if A[i]>B[j]:
C.append(B[j])
j+=1
rC+=lenA-i
else:
C.append(A[i])
i+=1
if i<lenA:
C=C+A[i:]
if j<lenB:
C=C+B[j:]
return (rC,C)

def sort_count(L):
‘’’
递归的切割,然后做合并
‘’’
if len(L)==1:
return (0,L)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值