排序算法小练习--Go语言

2 篇文章 0 订阅

初学Golang,同时为了熟悉一下排序算法。用Go语言实现了一下各种排序算法。


1. 冒泡排序

冒泡排序,最简单的排序算法之一。通过两层嵌套的循环实现对数组的排序。

可以这样理解:

  • 外层循环,每次找到剩余数组中最大值放于最后的位置。

  • 内嵌循环,通过 比较与 元素置换 将较大值一步步移动到最后位置

下面是Go语言实现:

func main() {  arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}//1.冒泡排序 BubbleSort//牛客题:失败了,时间超出  arr_bubbleSort := make([]int, len(arr))copy(arr_bubbleSort, arr)  bubbleSortResult := BubbleSort(arr_bubbleSort)  fmt.Println("冒泡排序:", bubbleSortResult)}func BubbleSort(arr []int) []int {//1.遍历,比较两个数大小,大的放后面。一遍后最大的数就在最后了for i := len(arr) - 1; i > 0; i-- {for j := 0; j < i; j++ {if arr[j] > arr[j+1] {        temp := arr[j+1]        arr[j+1] = arr[j]        arr[j] = temp      }    }  }return arr}

通过牛客网上的题测试,该算法时间超出。

冒泡排序算法的时间复杂度是O(n^2)。超时也在预料中。

上文冒泡排序的实现是稳定性算法,稳定性是指 排序后相等元素的先后顺序不变。

 


 

2. 插入排序

插入排序的复杂度也是O(n^2),但是实际开发中相比冒泡排序,更倾向于使用插入排序。这是因为插入排序在嵌套循环里只需更换一次元素,而冒泡排序每次置换经过了三次赋值操作。

插入排序详述为:

  • 从第一个元素开始遍历,认为前面的都是已经排序好的。

  • 后面的元素跟前一个比较,小的往前排,直到遇到比自己小的停止内层循环

 


 

3. 选择排序

选择排序的复杂度:O(n^2)

选择排序具体描述:

  • 从最后一个元素开始往前遍历数组

  • 内层循环通过比较 获取 最大值所在索引

  • 置换最大值与外层索引的值。这样最大值就排在了最后

代码实现如下:

func main() {  arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}  //2.选择排序 SelectionSort  arr_selectionSort := make([]int, len(arr))  copy(arr_selectionSort, arr)  selectionSortResult := SelectionSort(arr_selectionSort)  fmt.Println("选择排序:", selectionSortResult)}func SelectionSort(arr []int) []int {  //用最后一个数 和 前面的比较,最后最大值存到最后的位置。  for i := len(arr) - 1; i > 0; i-- {    index := i    for j := 0; j < i; j++ {      if arr[j] > arr[index] {        index = j      }    }    temp := arr[index]    arr[index] = arr[i]    arr[i] = temp  }  return arr}

 


 

4. 快速排序

 

快速排序的复杂度:O(nlog(n))

快排使用了递归的方法。具体描述如下:

  • 通过一个随机值对整个数组进行分组,左边的小于该数值,右边的大于该数值。

  • 分别对两边的数组再次使用该方法划分,直到递归数组只有一个元素

  • 最后整个数组就是有序的。

 

Go实现:

func main() {  arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}  //3.快速排序 QuickSort  arr_quickSort := make([]int, len(arr))  copy(arr_quickSort, arr)  quickSortResult := QuickSort(arr_quickSort)  fmt.Println("快速排序", quickSortResult)}func quickSort_recursion(arr []int, left, right int) {  i, j := left, right  //递归终止条件  if right <= left {    return  }  key := arr[i]  for i < j {    for i < j && arr[j] >= key {      j--    }    arr[i] = arr[j]    for i < j && arr[i] <= key {      i++    }    arr[j] = arr[i]  }  arr[i] = key  quickSort_recursion(arr, left, i-1)  quickSort_recursion(arr, i+1, right)}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值