• 比较排序


    不稳定排序算法

    希尔排序

    平均时间复杂度O(n^1.3)
    最好时间复杂度O(n)
    最坏时间复杂度O(n^2)
    空间复杂度O(1)

    func ShellSort(a []int, n int) {
    	dk := n / 2
    	for dk >= 1 {
    		shellInsertSort(a, n, dk)
    		dk /= 2
    	}
    }
    func shellInsertSort(a []int, n int, dk int) {
    	for i := dk; i < n; i += dk {
    		if a[i] < a[i-dk] {
    			j := i - dk
    			x := a[i]
    			a[i] = a[i-dk]
    			for j >= 0 && x < a[j] {
    				a[j+dk] = a[j]
    				j -= dk
    			}
    			a[j+dk] = x
    		}
    	}
    }
    

    简单选择排序

    平均时间复杂度O(n^2)
    最好时间复杂度O(n^2)
    最坏时间复杂度O(n^2)
    空间复杂度O(1)

    func SelectSort(a []int, n int) {
    	for i := 0; i < n; i++ {
    		key := i
    		for j := i + 1; j < n; j++ {
    			if a[key] > a[j] {
    				key = j
    			}
    		}
    		if key != i {
    			tmp := a[i]
    			a[i] = a[key]
    			a[key] = tmp
    		}
    	}
    }
    

    堆排序

    平均时间复杂度O(nlogn)
    最好时间复杂度O(nlogn)
    最坏时间复杂度O(nlogn)
    空间复杂度O(1)

    func HeapSort(a []int, n int) {
    	buildingHeap(a, n)
    	for i := n - 1; i > 0; i-- {
    		a[0],a[i]  = a[i],a[0]
    		heapAdjust(a, 0, i)
    	}
    }
    
    func heapAdjust(a []int, s int, n int) {
    	child := 2*s + 1
    	for child < n {
    		if child+1 < n && a[child] > a[child+1] {
    			child++
    		}
    		if a[s] > a[child] {
    			a[s],a[child] = a[child],a[s]
    			s = child
    			child = 2*s + 1
    		} else {
    			break
    		}
    	}
    }
    func buildingHeap(a []int, n int) {
    	for i := (n - 1) / 2; i >= 0; i-- {
    		heapAdjust(a, i, n)
    	}
    }
    

    快速排序

    平均时间复杂度O(nlogn)
    最好时间复杂度O(nlogn)
    最坏时间复杂度O(n^2)
    空间复杂度O(nlogn)

    func QuickSort(a []int, l int, r int) {
    	if l < r {
    	        i,j,x := l,r,a[l]
    		for i < j {
    			for i < j && a[j] >= x {
    				j--
    			}
    			if i < j {
    				a[i] = a[j]
    				i++
    			}
    			for i < j && a[i] < x {
    				i++
    			}
    			if i < j {
    				a[j] = a[i]
    				j--
    			}
    		}
    		a[i] = x
    		QuickSort(a, l, i-1)
    		QuickSort(a, i+1, r)
    	}
    }
    

    稳定排序算法

    冒泡排序

    平均时间复杂度O(n^2)
    最好时间复杂度O(n)
    最坏时间复杂度O(n^2)
    空间复杂度O(1)

    func BubbleSort(a []int, n int) {
    	for i := 0; i < n-1; i++ {
    		for j := 0; j < n-i-1; j++ {
    			if a[j] > a[j+1] {
    				tmp := a[j]
    				a[j] = a[j+1]
    				a[j+1] = tmp
    			}
    		}
    	}
    }
    

    直接插入排序

    平均时间复杂度O(n^2)
    最好时间复杂度O(n)
    最坏时间复杂度O(n^2)
    空间复杂度O(1)

    func InsertSort(a []int, n int) {
    	for i := 1; i < n; i++ {
    		if a[i] < a[i-1] {
    			j := i - 1
    			x := a[i]
    			a[i] = a[i-1]
    			for j >= 0 && x < a[j] {
    				a[j+1] = a[j]
    				j--
    			}
    			a[j+1] = x
    		}
    	}
    }
    

    归并排序

    平均时间复杂度O(nlogn)
    最好时间复杂度O(nlogn)
    最坏时间复杂度O(nlogn)
    空间复杂度O(n)

    func MergeSort(a []int,f int,l int, tmp []int) {
    	if f<l {
    		mid := (f+l)/2
    		MergeSort(a,f,mid,tmp)
    		MergeSort(a,mid+1,l,tmp)
    		mergeArray(a,f,mid,l,tmp)
    	}
    }
    func mergeArray(a []int,f int, mid int,l int, tmp []int) {
    	i:= f
    	j:= mid+1
    	m := mid
    	n := l
    	k := 0
    	for i<=m && j<=n {
    		if a[i]<=a[j]{
    			tmp[k] = a[i]
    			k++
    			i++
    		} else {
    			tmp[k] = a[j]
    			k++
    			j++
    		}
    	}
    	for i<=m{
    		tmp[k] = a[i]
    		k++
    		i++
    	}
    	for j<=n{
    		tmp[k] = a[j]
    		k++
    		j++
    	}
    	for i:=0;i<k;i++{
    		a[f+i] = tmp[i]
    	}
    }
    
  • 相关阅读:
    windows快捷键十八式(win10)
    解决滚动条突然出现导致的页面错位问题
    用命令行撤销工作区的所有更改(修改文件&&新增文件)
    用animation的steps属性制作帧动画
    配置Gitlab pages和Gitlab CI
    zookeeper中的分布式一致性协议
    kafka消息的处理机制(五)
    Paxos算法原理
    kafka同步异步消费和消息的偏移量(四)
    kafka客户端和服务端开发(三)
  • 原文地址:https://www.cnblogs.com/weiweng/p/12485864.html
Copyright © 2020-2023  润新知