golang数据结构之冒泡排序】的更多相关文章

//BubbleSort 冒泡排序 func BubbleSort(arr *[]int) { ; i >= ; i-- { ; j-- { if (*arr)[j] > (*arr)[i] { (*arr)[j], (*arr)[i] = (*arr)[i], (*arr)[j] } } fmt.Printf(-i, *arr) } }…
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以及平衡二叉树的构建与查找,然后还聊了哈希表的构建与查找.接下来的几篇博客中我们就集中的聊一下常见的集中排序方式,并并给出相应的时间复杂度.本篇博客我们将会详细的介绍冒泡排序.插入排序.希尔排序以及选择排序,下篇博客将继续介绍堆排序.归并排序以及快速排序的相关内容.当然上述内容的代码实现我们依然采用S…
golang语言的一些数据结构实现,包括: 队列(单队列.循环队列) 链表(单链表.双链表.循环链表(解决约瑟夫环问题)) 栈(实现加减乘除计算) 递归之迷宫问题 哈希表(员工管理系统) 树(三种遍历方式) 排序(冒泡.选择.插入.快速排序) 稀疏数组(存储和读取稀疏数组) 相关代码:https://github.com/taishan1994/golang_data_structure/tree/master…
基础语法差不多了, 就需要系统的撸一下数据结构和算法了. 没找到合适的书, 就参考github项目: https://github.com/floyernick/Data-Structures-and-Algorithms/ 注意golang里没有main函数,不能执行, 测试时,使用go test即可. BinarySearch.go package BinarySearch //二分法查找 func BinarySearch(array []int, number int) int { mi…
冒泡排序是一种基础排序算法,在python中,我们利用列表的的方式来完成,它对列表中的元素进行重复的遍历,在遍历的同时进行比较,如果两个数没有按照我们规定的顺序进行排列,就按照我们预先设定好的是顺序或者逆序输出,类似于烧开水时的气泡,主要操作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直…
def bubble_sort(alist): # 外层循环冒泡排序进行的次数(len-1) for i in range(len(alist) - 1, 0, -1): # 内层循环控制冒泡的比较:j表示从0开始的第 j 次比较, for j in range(i): if alist[j] > alist[j + 1]: alist[j], alist[j + 1] = alist[j + 1], alist[j] return alist a = [6,5,4,3,2,1,0] bubbl…
1.核心思想:比较两个元素,如果前一个比后一个大则进行交换,经过对每个元素的比较,最后最大的元素被放在在最后位置 操作方法: 外层正常for循环遍历,到n-1位,内层for循环相邻两个数比较大小,小数在左边,大数在右边. 第一趟外层循环会把最大数依次比较互换位置,逐渐挪动到最后,比如例子里面元素6(虽然6已经在最后一位了) 第二趟外层循环会把第二大的数选出来,所以内层循环次数会减少一次,因为最大数已经选出来了 .....直到遍历结束 2.优化: , 0, 3, 6 开始第一趟比较开始,经过3趟的…
每种语言在实现数据结构有些许不同.go 是如何实现的呢? 1. 数组 Array go 中数组是相同的元素组成的集合,计算机会为数组分配一段连续的内存来保存元素,可以利用索引快速访问元素. go 中数组用两个维度来描述:元素类型 和 元素个数.元素类型相同,大小不同的数组在 go 中被认为是不同的数据类型.只有两者完全相同才是相同的类型. 数组在舒适化之后大小就无法改变了. 数组的长度是固定的,数据越界是严重的错误,但在编译阶段 go 自动检查越界问题. package main import…
队列可以用数组或链表实现,遵从先入先出. 目录结构: 在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://www.cnblogs.com/xiximayou/p/12005480.html 一个队列需要有四要素:容量.队首指针.队尾指针.存储数据的数组: 当队尾指针==容量-1时,此时队列已满,就不能再有数据进队: 当队首指针==队尾指针时,此时队列已空,就不能再从队列中取出数据: 同时可以发现,这种队列只能使用一次,因为那时队首和队尾都指向队尾了. 代码如下:…
循环链表还是挺有难度的: 向链表中插入第一条数据的时候如何进行初始化. 删除循环链表中的数据时要考虑多种情况. 详情在代码中一一说明. 目录结构如下: circleLink.go package link import ( "fmt" ) type CatNode struct { ID int Name string next *CatNode } func InserCatNode(head *CatNode, newCatNode *CatNode) { //初始化链表 //头结…
tree.go package tree import ( "fmt" ) type TreeNode struct { ID int Val int Left *TreeNode Right *TreeNode } func PreOrder(root *TreeNode) { if root != nil { fmt.Printf("%d ", root.Val) PreOrder(root.Left) PreOrder(root.Right) } } func…
hash.go package hash import ( "fmt" ) type Emp struct { ID int Name string Next *Emp } //第一个节点就存放员工 type EmpLink struct { Head *Emp } //定义HashTable type HashTable struct { LinkArr []EmpLink } //添加员工的方法 func (empl *EmpLink) InsertEmp(emp *Emp) {…
简单来说:递归就是函数/方法自己调用自己,只是每次传入不同的变量. 递归可以解决各种数学问题:n皇后问题.阶乘问题.汉诺塔.迷宫问题.球和篮子问题等等: maze.go package maze import ( "fmt" ) func SetWay(myMap *[][]int, i int, j int) bool { //分析什么情况下就找到通路 ][] == { return true } else { //如果是可以探测的 { //假设是通的 myMap[i][j] = /…
例如:3+2*6-2 先定义两个栈,一个为数值栈,一个为运算符栈: stack.go package stack import ( "errors" "fmt" ) type Stack struct { MaxTop int //栈最大可以存放的数量 Top int //栈顶 Arr []int //模拟栈 } func (s *Stack) Push(val int) (err error) { //先判断栈是否满了 { fmt.Println("栈满…
stack.go package stack import ( "errors" "fmt" ) type Stack struct { MaxTop int //栈最大可以存放的数量 Top int //栈顶 arr []int //模拟栈 } func (s *Stack) Push(val int) (err error) { //先判断栈是否满了 { fmt.Println("栈满了") return errors.New("栈…
具体过程:黑色标记代表左指针,红色标记代表右指针,蓝色标记代表中间值.(依次从左往向下) //QuickSort 快速排序 func QuickSort(left ]int) { l := left r := right pivot := arr[(left+right)/] tmp := for l < r { for arr[l] < pivot { l++ } for arr[r] > pivot { r-- } if l >= r { break } tmp = arr[l…
//SelectSort 选择排序 func SelectSort(arr *[]int) { ; i < len(arr); i++ { tmp := arr[i] index := i ; j < len(arr); j++ { if (*arr)[j] < tmp { tmp = (*arr)[j] index = j } } if index != i { (*arr)[index], (*arr)[i] = (*arr)[i], (*arr)[index] } fmt.Prin…
//InsertSort 插入排序 func InsertSort(arr *[]int) { ; i < len(arr); i++ { insertVal := (*arr)[i] inserIndex := i - && (*arr)[inserIndex] > insertVal { (*arr)[inserIndex+] = (*arr)[inserIndex] inserIndex-- } //插入 ) != i { (*arr)[inserIndex+] = in…
josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid(num int) *Kid { first := &Kid{} cur := &Kid{} { fmt.Println("不合法") return first } ; i <= num; i++ { kid := &Kid{ ID: , } { first =…
目录结构: doubleLink.go package link import ( "fmt" ) //HerosNode 链表节点 type HerosNode struct { ID int Name string pre *HerosNode //指针 next *HerosNode //指针 } //InsertHerosNode 插入 func InsertHerosNode(head *HerosNode, newHerosNode *HerosNode) { tmp :=…
实现单链表的增删查改. 目录如下: singleLink.go package link import ( "fmt" ) //HeroNode 链表节点 type HeroNode struct { ID int Name string next *HeroNode //指针 } //InsertHeroNode 插入 func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) { tmp := head for { if t…
目录结构: circlequeue.go package queue import ( "errors" "fmt" ) //CircleQueue 环型队列 type CircleQueue struct { MaxSize int Array []int Front int Rear int } //Push 向队列中添加一个值 func (q *CircleQueue) Push(val int) (err error) { //先判断队列是否已满 if q.…
掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( "bufio" "fmt" "io" "os" "strconv" "strings" // "strconv" ) func originArr() [][]int { //创建…
队列和堆栈不一样的地方在于进出顺序: 堆栈是后进先出, 队列是先进先出. QueueLinkedList.go package QueueLinkedList type Node struct { data int next *Node } type Queue struct { rear *Node } func (list *Queue) Enqueue(i int) { data := &Node{data: i} if list.rear != nil { data.next = lis…
会了上一个,这个就差不离了. StackLinkedList.go package StackLinkedList type Node struct { data int next *Node } type Stack struct { top *Node } func (list *Stack) Push(i int) { data := &Node{data: i} if list.top != nil { data.next = list.top } list.top = data } f…
用数组实现的堆栈, 另一种,是用链表实现的堆栈, 在各种不同的编程语言上, 实现都是类似的. StackArray.go package StackArray //基于数组实现的堆栈 const arraySize = 10 type Stack struct { top int data [arraySize]int } func (s *Stack) Push(i int) bool { if s.top == len(s.data) { return false } s.data[s.to…
双向链表比起单向链表, 多了一个向前指向的指针, 所以在增删查改时,要同时照顾到两个指针的指向. DoublyLinkedList.go package DoublyLinkedList //双向链表 type Node struct { data int next *Node prev *Node } type DoublyLinkedList struct { head *Node tail *Node } func (list *DoublyLinkedList) InsertFirst(…
差不多自己看懂了,可以自己写测试了.:) LinkedList.go package LinkedList //"fmt" type Node struct { data int next *Node } type LinkedList struct { head *Node } func (list *LinkedList) InsertFirst(i int) { data := &Node{data: i} if list.head != nil { data.next…
慢慢练语法和思路, 想说的都在代码及注释里. CircularBuffer package CircularBuffer const arraySize = 10 type CircularBuffer struct { data [arraySize]int pointer int } //只实现了CircularBuffer环形缓冲队列的基本方法 func (b *CircularBuffer) InsertValue(i int) { if b.pointer == len(b.data)…
基础 安装golang环境 Golang基础,流程控制,函数,方法,面向对象 网络编程(自己做一个简单的tcp的聊天室,websocket,http,命令行工具) 并发(可以看一下并发爬虫或者下载器的项目) Golang数据结构的使用方式(地鼠文档上有) 进阶 数据库mysql 增删改查 redis相关内容 Gin框架(iris和beego有空也可以学习学习,但是gin必学) Golang其他的插件库 (这里可以做一个简单的网站,综合上面的东西使用) 了解缓存,进程,性能方面的内容和解决问题的方…