冒泡排序
冒泡排序更是入门级级别的排序方法,不多说什么了,时间复杂度(最好 O(n),最坏O(n^2)),空间复杂度:O(1)
代码:
func MaoPao(nums []int ,n int) []int{
for i:=n;i>0;i--{
flag:=false
for j:=1;j<i;j++{
if nums[j-1]>nums[j]{
nums[j-1],nums[j]=swap(nums[j-1],nums[j])
flag=true
}
}
if flag==false{
break
}
}
return nums
}
注意:一定要设置一个flag来确定还有没有发生交换,不要做无用的比较
快速排序
快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。
如果大家对快速不是很理解的话,可以去找一下过程的那种动图,非常清楚
代码:
func QuickSort(nums []int ,left,right int){
if left>right{
return
}
i:=Sort1(nums,left,right)
QuickSort(nums,left,i-1)
QuickSort(nums,i+1,right)
}
func Sort1(nums []int,left,right int)int{ //first找大,right找小
temp:=nums[left]
i:=left
j:=right
for i!=j{
for nums[j]>=temp && i<j{
j--
}
for nums[i]<=temp && i<j{
i++
}
if i<j{
nums[i],nums[j]=swap(nums[i],nums[j])
}
}
nums[left]=nums[i]
nums[i]=temp
return i
}