• 比较排序


    不稳定排序算法

    希尔排序

    平均时间复杂度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]
    	}
    }
    
  • 相关阅读:
    SQL多表合并查询结果
    无法访问请求的页面,因为该页的数据的相关配置数据无效
    网站运行的时候编译成功但是程序浏览器的页面不会显示怎么回事啊
    EasyUI 在textbox里面输入数据敲回车后查询和普通在textbox输入数据敲回车的区别
    搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇
    Python开发工具安装
    jQuery 插件写法2
    jQuery插件面向对象开发
    Jquery插件学习
    Maven 仓库
  • 原文地址:https://www.cnblogs.com/weiweng/p/12485864.html
Copyright © 2020-2023  润新知