zoukankan      html  css  js  c++  java
  • 排序算法

    1. 冒泡排序

    /**
    * 冒泡排序
     */
    func BubbleSort(slice []int) {
    	n := len(slice)            //切片长度
    	for i := 0; i < n-1; i++ { //冒泡最多n-1轮
    		exchange := false
    		for j := 0; j < n-1-i; j++ { //每一轮冒泡
    			if slice[j] > slice[j+1] { //调换位置
    				slice[j], slice[j+1] = slice[j+1], slice[j]
    				exchange = true
    			}
    		}
    		if !exchange { //没有发生位置调换,已是有序,可提前退出
    			break
    		}
    	}
    }
    

    2. 选择排序

    /**
    * 选择排序
     */
    func SelectSort(slice []int) {
    	n := len(slice)
    	for i := 0; i < n-1; i++ {
    		pos := i
    		for j := i + 1; j < n; j++ {
    			if slice[j] < slice[pos] {
    				pos = j //记录最小数位置
    			}
    		}
    		if pos != i { //调换位置
    			slice[i], slice[pos] = slice[pos], slice[i]
    		}
    	}
    }
    

    3. 插入排序

    /**
    * 插入排序
     */
    func InsertSort(slice []int) {
    	n := len(slice)
    	for i := 1; i < n; i++ {
    		for j := i; j > 0; j-- { //从后往前比较,边比较边移位,直至找到插入位置
    			if slice[j] < slice[j-1] { //调换位置
    				slice[j-1], slice[j] = slice[j], slice[j-1]
    			} else { //已找到插入位置,进入下一个待排序元素的插入
    				break
    			}
    		}
    	}
    }
    

    4. 希尔排序

    算法原理理解:https://blog.csdn.net/qq_39207948/article/details/80006224

    /**
    * 希尔排序:对插入排序的优化,适用于大量数据排序
    */
    func ShellSort(slice []int) {
    	n := len(slice)
    	for add := n / 2; add > 0; add /= 2 { //增量控制
    		for i := add; i < n; i++ {
    			for j := i; j >= add; j -= add {
    				if slice[j] < slice[j-add] {
    					slice[j-add], slice[j] = slice[j], slice[j-add]
    				} else {
    					break
    				}
    			}
    		}
    	}
    }
    

    5. 堆排序

    算法原理理解:https://www.cnblogs.com/Java3y/p/8639937.html

    /**
    * 堆排序:利用堆进行选择排序
     */
    func HeapSort(slice []int) {
    	n := len(slice)
    	//建堆
    	for root := n / 2; root >= 0; root-- {
    		Heapify(slice, root)
    	}
    	//排序
    	for i := n; i > 1; i-- {
    		slice[0], slice[i-1] = slice[i-1], slice[0]
    		Heapify(slice[:i-1], 0)
    	}
    }
    
    //堆调整
    func Heapify(slice []int, root int) {
    	n := len(slice)
    	left := root*2 + 1
    	right := root*2 + 2
    	max := root
    	if left < n && slice[max] < slice[left] {
    		max = left
    	}
    	if right < n && slice[max] < slice[right] {
    		max = right
    	}
    	if max != root {
    		slice[root], slice[max] = slice[max], slice[root]
    		Heapify(slice, max)
    	}
    }
    

    6. 归并排序

    算法原理理解:https://www.jianshu.com/p/33cffa1ce613

    /**
    * 归并排序
     */
    func MergeSort(slice []int) {
    	n := len(slice)
    	if n == 1 {
    		return
    	}
    	mid := n / 2
    	MergeSort(slice[:mid])
    	MergeSort(slice[mid:n])
    	p1, p2 := 0, mid
    	var newSlice []int
    	for p1 < mid && p2 < n {
    		if slice[p1] < slice[p2] {
    			newSlice = append(newSlice, slice[p1])
    			p1++
    		} else {
    			newSlice = append(newSlice, slice[p2])
    			p2++
    		}
    	}
    	if p1 < mid {
    		for p1 < mid {
    			newSlice = append(newSlice, slice[p1])
    			p1++
    		}
    	}
    	if p2 < n {
    		for p2 < n {
    			newSlice = append(newSlice, slice[p2])
    			p2++
    		}
    	}
    	for k, v := range newSlice {
    		slice[k] = v
    	}
    }
    

    7. 快速排序

    func QuickSort(slice []int, start, end int) {
    	if start >= end {
    		return
    	}
    	i, j := start, end
    	val := slice[(start+end)/2]
    	for i <= j {
    		for i <= end && slice[i] < val {
    			i++
    		}
    		for j >= start && slice[j] > val {
    			j--
    		}
    		if i <= j {
    			slice[i], slice[j] = slice[j], slice[i]
    			i++
    			j--
    		}
    	}
    	if start < j {
    		QuickSort(slice, start, j)
    	}
    	if i < end {
    		QuickSort(slice, i, end)
    	}
    }
    
  • 相关阅读:
    iOS 3DES加密
    AFNetworking实现程序重新启动时的断点续传
    iPhone缓存网络数据
    SDWebImage使用——一个可管理远程图片加载的类库
    IOS中UITableView异步加载图片的实现
    使用UIImageView展现来自网络的图片
    obj-c学习笔记
    IOS开发-发送邮件(E-mail)方法整理合集(共3种)
    设置tableView背景颜色
    Spring整合JMS(三)——MessageConverter介绍
  • 原文地址:https://www.cnblogs.com/wujuntian/p/11612892.html
Copyright © 2011-2022 走看看