当前位置: 首页 > article >正文

【AcWing】快速排序的Go实现

快速排序的Go实现

这一部分参考了AcWing当中使用Go语言实现快速排序的题解:https://www.acwing.com/activity/content/code/content/296206/。

其中有很多部分非常值得参考,故写一个博客进行记录。

Code

package main

import "fmt"

func quick_sort(q []int, l, r int) {
	if l >= r {
		return
	}

	x := q[l+(r-l)/2]
	i, j := l-1, r+1

	for i < j {
		for i++; q[i] < x; i++ {
		}
		for j--; q[j] > x; j-- {
		}
		if i < j {
			q[i], q[j] = q[j], q[i]
		}
	}
	quick_sort(q, l, j)
	quick_sort(q, j+1, r)
}

func main() {
	var n int
	fmt.Scanf("%d", &n)

	q := make([]int, n+5)
	for i := 1; i <= n; i++ {
		fmt.Scanf("%d", &q[i])
	}

	quick_sort(q, 1, n)

	for i := 1; i <= n; i++ {
		fmt.Printf("%d ", q[i])
	}
	return
}

  • 首先,对于大部分只需要标准输入输出的算法题,只需要导入fmt包即可,fmt可以完成标准的输入输出。使用fmt.Scanf("%d", &n)完成数组长度n的输入,使用fmt.scanf("%d, &q[i])来完成数组当中元素的输入。
  • 其次,在创建长度为n的数组时,可以使用Go当中的make方法,第一个参数是类型,即int[],而第二个参数是长度,由于我使用的下标从1开始,因此此处创建数组的长度比n稍大,避免越界。
  • 使用fmt.Prinf("%d", q[i])完成数组的遍历输出。
  • 在quick_sort部分,可以看到i, j := l-1, r+1q[i], q[j] = q[j], q[i]这样的语句,Go语言可以像Python那样一次为多个变量进行赋值,其中q[i], q[j] = q[j], q[i]直接完成了C++当中的swap操作。
  • for i++; q[i] < x; i++ {} 操作直接等价于C++当中的do{i ++;} while(q[i] < x),注意Go语言当中没有do... while...的用法,可以使用上述for循环进行替代,Go语言中只有for一种循环语句,但是它是非常灵活的。
  • 在快速排序选取哨兵结点时,必须使用x := q[l+(r-l)/2],否则会报错。
  • 需要注意的是,在AcWing的OJ中,Go语言实现的快排执行时间来到了4900+ms,而C++版本实现的快排仅需要100+ms,差距非常大,说明C++的效率非常的高。

http://www.kler.cn/news/305914.html

相关文章:

  • yolo训练出现Could not load library libcudnn_cnn_train.so.8问题及解决方法
  • 从大脑图谱/ROI中提取BOLD信号
  • 简单易懂的方式来解释机器学习(ML)和深度学习(DL)的区别与联系
  • 通信工程学习:什么是DWDM密集波分复用
  • 小众语言ruby在苹果中的初步应用
  • self-play RL学习笔记
  • 【开源免费】基于SpringBoot+Vue.JS购物商城网站(JAVA毕业设计)
  • ImDisk Toolkit将一部分RAM模拟成硬盘分区
  • 更新20240915机器视觉海康Visionmaster学习步骤
  • 解决tiktoken库调用get_encoding时SSL超时
  • Redis 与数据库数据一致性保证详解
  • MySQL——数据库的高级操作(二)用户管理(5)如何解决 root 用户密码丢失
  • 【QT】自制一个简单的时钟(跟随系统时间)
  • 9.15javaweb项目总结
  • vs code: pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本
  • 【计网】从零开始使用UDP进行socket编程 --- 服务端业务实现
  • 在 Java 中实现 Kafka Producer 的单例模式
  • Java实现建造者模式和源码中的应用
  • 俄罗斯方块——C语言实践(Dev-Cpp)
  • random.randrange与torch.arange的用法
  • Spring 源码解读:自定义实现BeanPostProcessor的扩展点
  • 热门远程控制工具大盘点,职场必备
  • Java架构师实战篇Redis亿级数据统计方案
  • 【智路】智路OS Perception Camera Service
  • 【JAVA开源】基于Vue和SpringBoot的在线旅游网站
  • sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)
  • conda、anaconda、pip、torch、pytorch、tensorflow到底是什么东西?(转载自本人的知乎回答)
  • php转职golang第一期
  • 深度学习-物体检测YOLO(You only look once)
  • 【SQL】百题计划:SQL对于空值的比较判断。