1。计数排序包sortfunccountingSort(arr[]int,biasint)(retArr[]int){countingArr:=make([]int,bias+1,bias+1)retArr=make([]int,len(arr),cap(arr))for_,v:=rangearr{countingArr[v]++}fori:=1;我=0;i--{retArr[countingArr[arr[i]]-1]=arr[i]countingArr[arr[i]]--}return}2.插入排序Insertionsort,英文名称(insertionsort)很简单和有效的比较排序算法。思路:在每次迭代过程中,算法从输入序列中随机移除一个元素,并将改变后的元素插入待排序序列的正确位置。重复这个过程,直到所有输入元素都被选中一次,排序结束。打个比方:抽卡包sortfuncinsertionSort(unsorted[]int){length=len(unsorted)fori:=0;我<长度;i++{varinsertElement=unsorted[i]varinsertPosition=iforj:=insertPosition-1;j>=0;j--{ifinsertElementnums[i+1]{nums[i],nums[i+1]=nums[i+1],nums[i]lastSwapTemp=i}}iflastSwap==lastSwapTemp{中断}}}4.选择排序选择排序(selectionsort)是一种就地(in-place)排序算法,适用于数据量较小的情况。由于选择操作是根据键值进行的,交换操作只在需要的时候进行,所以选择排序用于数值大而键值小的文件。packagesortfuncselectionSort(nums[]int){length=len(nums)varminIdxint//所选最小值的位置i:=0;我<长度-1;i++{minIdx=i//每次循环的第一个元素保持最小值varminValue=nums[minIdx]forj:=i;j<长度-1;j++{ifminValue>nums[j+1]{minValue=nums[j+1]minIdx=j+1}}//如果最小值的位置发生变化,保存最小值的当前位置ifi!=minIdx{vartemp=nums[i]nums[i]=nums[minIdx]nums[minIdx]=temp}}}详见文章:跟着动画学Go数据结构选择排序5.堆排序堆排序是一种树选择排序算法。堆排序的过程:构造初始堆并输出堆顶元素后,自上而下调整,将顶元素与其左右子树的根节点进行比较,将最小的元素交换到顶堆的;然后不断调整,直到叶子节点得到一个新的堆。packagesortimport("github.com/shady831213/algorithms/heap")funcheapSort(arr[]int){h:=heap.NewHeapIntArray(arr)fori:=h.Len()-1;我>0;i--{h.Pop()}}/*不是泛型堆*/typeintArrayForHeapSort[]intfunc(h*intArrayForHeapSort)parent(iint)int{returni>>1}func(h*intArrayForHeapSort)left(iint)int{return(i<<1)+1}func(h*intArrayForHeapSort)right(iint)int{return(i<<1)+2}func(h*intArrayForHeapSort)maxHeaplify(iint){最大,largestIdx:=(*h)[i],iif(*h).left(i)最大{largest,largestIdx=(*h)[(*h).left(i)],(*h).left(i)}如果h.right(i)largest{_,largestIdx=(*h)[h.right(i)],h.right(i)}如果我!=largestIdx{(*h)[largestIdx],(*h)[i]=(*h)[i],(*h)[largestIdx]h.maxHeaplify(largestIdx)}}func(h*intArrayForHeapSort)buildHeap(){fori:=(len((*h))>>1)-1;我>=0;i--{h.maxHeaplify(i)}}funcheapSort2(arr[]int){h:=intArrayForHeapSort(arr)h.buildHeap()fori:=len(h)-1;我>0;i--{h[0],h[i]=h[i],h[0]h=h[:i]h.maxHeaplify(0)}}详见文章:跟着动画学Go数据结构堆排序6.山排序包sortfuncswap(array[]int,aint,bint){array[a]=array[a]+array[b]array[b]=array[a]-array[b]array[a]=array[a]-array[b]}funcshellSort(array[]int){length=len(array)对于间隙:=长度/2;差距>0;gap=gap/2{fori:=gap;我<长度;i++{varj=ifor{如果j-gap<0||array[j]>=array[j-gap]{break}swap(array,j,j-gap)j=j-gap}}}}详见文章:HillsortingofGodatastructurefollowinganimation7.归并排序使用递归和分而治之的技术将数据序列分成越来越小的半子列表,然后对半子列表进行排序,最后使用递归步骤将排序后的半子列表合并为越来越大的有序序列,其中“return”代表的是递归的,即递归地将数组对半拆分成一个数组。给定一组包含n个元素的序列,首先将每两个相邻的长度为1的子序列合并,得到n/2(向上取整)个长度为2或1的有序子序列,然后两两合并,重复执行此过程,直到得到有序序列。包排序/*合并排序O(nlgn):T(n)=2T(n/2)+O(n)主定理:a=2,b=2,f(n)=nlogb(a)=lg2=1f(n)=f(n^logb(a))=f(n^1)so,O(n)=O(n^logb(a)lgn)=O(nlgn)*/import("sync")funcmerge(arr[]int){i:=len(arr)/2//复制左右数组leftArr,rightArr:=make([]int,i,i),make([]int,len(arr)-i,len(arr)-i)复制(leftArr,arr[:i])复制(rightArr,arr[i:])leftIter,rightIter:=ints(leftArr).Iter(),ints(rightArr).Iter()leftValue,leftHasNext:=leftIter()rightValue,rightHasNext:=rightIter()//mergefork:=rangearr{if!leftHasNext{//左为空,使用右值,在CLRS中,使用无穷大arr[k]=rightValuerightValue,rightHasNext=rightIter()}elseif!rightHasNext{//右空,使用左值,在CLRS中,使用无穷大arr[k]=leftValueleftValue,leftHasNext=leftIter()}else{ifleftValue>rightValue{arr[k]=rightValuerightValue,rightHasNext=rightIter()}else{arr[k]=leftValueleftValue,leftHasNext=leftIter()}}}}funcmergeSort(arr[]int){i:=len(arr)/2如果i>0{mergeSort(arr[:i])mergeSort(arr[i:])merge(arr)}}funcmergeSortParallel(arr[]int){i:=len(arr)/2ifi>0{varwdsync.WaitGroupwd.Add(2)gofunc(){mergeSortParallel(arr[:i])wd.Done()}()gofunc(){mergeSortParallel(arr[i:])wd.Done()}()wd.Wait()合并(arr)}}8。快速排序是一种高效的排序算法,采用分而治之的思想,把大的拆分成小的,再把小的拆分成小的。原理是:对于给定的一组记录,经过一次排序后,将原始序列分成两部分,其中前一部分的所有记录都小于后一部分的所有记录,然后对记录进行快速排序依次在前后两部分,递归这个过程,直到sequence中的所有记录都按顺序排列。packagesortimport"math/rand"funcpartition(arr[]int)(primeIdxint){primeIdx=0fori:=0;我1{primeIdx:=partition(arr)quickSort(arr[:primeIdx])quickSort(arr[primeIdx+1:])}}funcrandomQuickSort(arr[]int){iflen(arr)>1{primeIdx:=rand.Intn(len(arr))arr[primeIdx],arr[len(arr)-1]=arr[len(arr)-1],arr[primeIdx]primeIdx=partition(arr)randomQuickSort(arr[:primeIdx])randomQuickSort(arr[primeIdx+1:])}}funcquickSortTail(arr[]int){forlen(arr)>1{primeIdx:=partition(arr)ifprimeIdx