zoukankan      html  css  js  c++  java
  • go排序

    插入排序

    package main
    
    import "fmt"
    
    func main() {
    
    	arr := []int{4, 6, 1, 9, 2}
    	newarr := insertSort(arr)
    	fmt.Println(arr)
    	fmt.Println(newarr)
    }
    
    // 插入排序,从第二个元素开始和前一个比较,小于就将前一个数往后移,然后就插入第一个元素,后然依次类推
    func insertSort(arr []int) []int {
    	for i := 1; i < len(arr); i++ {
    		j := i
    		current := arr[j]
    		for j > 0 {
    			if arr[j-1] > current {
    				arr[j] = arr[j-1]
    				j--
    			} else {
    				break
    			}
    		}
    
    		arr[j] = current
    	}
    
    	return arr
    }

    冒泡排序

    package main
    
    import "fmt"
    
    func main() {
    
    	arr := []int{4, 6, 1, 9, 2}
    	newarr := bubbleSort(arr)
    	fmt.Println(arr)
    	fmt.Println(newarr)
    }
    
    // 从第一个元素开始和后面逐个比较,大的往后移,小的移前移,第一轮移动最后一个,第二轮移动倒数第二个,直接第一个元素不能再比较移动
    func bubbleSort(arr []int) []int {
    
    	i := len(arr)
    	for i > 0 {
    		for j := 0; j < i-1; j++ {
    			if arr[j] > arr[j+1] {
    				arr[j], arr[j+1] = arr[j+1], arr[j]
    			}
    		}
    
    		i--
    	}
    
    	return arr
    }

    选择排序

    package main
    
    import "fmt"
    
    func main() {
    
    	arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
    	newarr := selectionSort(arr)
    	fmt.Println(arr)
    	fmt.Println(newarr)
    }
    
    // 选择排序,由左边起第一个起,找出最小的和第一个交换位置,再从第二个起,找出最小的和第二个交换位置,重复可得结果.
    func selectionSort(arr []int) []int {
    
    	for i := 0; i < len(arr)-1; i++ {
    		minIdx := i
    		for j := i; j < len(arr)-1; j++ {
    			if arr[minIdx] > arr[j+1] {
    				minIdx = j + 1
    			}
    		}
    
    		arr[i], arr[minIdx] = arr[minIdx], arr[i]
    	}
    
    	return arr
    }

    希尔排序

    package main
    
    import "fmt"
    
    func main() {
    
    	arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
    	newarr := shellSort(arr)
    	fmt.Println(arr)
    	fmt.Println(newarr)
    }
    
    // 希尔排序,先除以2得最大间隔两数组成组进和地插入排序,再将间隔/2组成组插入排序,直到没有间隔
    func shellSort(arr []int) []int {
    
    	l := len(arr)
    
    	// 间隔多少组成一组,除以2表示最大间隔
    	d := l / 2
    
    	for d > 0 {
    		for i := 0; i < d; i++ {
    			// 插入排序
    			for z := i + d; z < l; z = z + d {
    				j := z
    				current := arr[j]
    				for j > i && arr[j-d] > current {
    					arr[j] = arr[j-d]
    					j = j - d
    				}
    
    				arr[j] = current
    			}
    		}
    
    		// 将间隔减倍
    		d = d / 2
    	}
    
    	return arr
    }
  • 相关阅读:
    anguar使用指令写选项卡
    前端性能优化
    有关楼层般的侧导航
    我对面向对象的深刻理解
    jq中的表单验证插件------jquery.validate
    JavaScript 语言中的 this
    闭包,作用域链,垃圾回收,内存泄露
    angular.extend、angular.$watch、angular.bootstrap
    Angular路由(三)
    Angular基础(二)
  • 原文地址:https://www.cnblogs.com/wahgon/p/15361215.html
Copyright © 2011-2022 走看看