首页 > 编程语言 > 详细

golang 排序

时间:2021-01-06 22:18:21      阅读:44      评论:0      收藏:0      [点我收藏+]
package main

import "fmt"


//插入排序  稳定排序  时间O(n^2)
func Inserts(nums []int,n int)  {
    var j int
    for i:=1;i<n;i++{
        if nums[i]<nums[i-1]{
            //保存临时数据,数组数据后移
            tmp:=nums[i]
            //注意边界 j>0
            for j=i;j>0&&nums[j-1]>tmp;j--{
                nums[j] = nums[j-1]
            }
            nums[j] = tmp
        }
    }
}

//快排    不稳定排序  O(nlogn)  还有多路快排优化
//j = len(array)-1
func Fast(array []int,i,j int)  {
    left:=i
    right:=j
    //超出范围 退出,递归停止条件
    if left>right{
        return
    }

    tmp:=array[left]
    for left<right{
        for left<right&&array[right]>=tmp{
            right--
        }
        array[left] = array[right]
        for left<right&&array[left]<=tmp{
            left++
        }
        array[right] = array[left]
    }
    array[left] = tmp
    Fast(array,i,left-1)
    Fast(array,left+1,j)
}

//归并   稳定排序  时间O(nlogn)  空间O(n) 有多路归并,
// 归并可以结合很多其他知识 链表,树等等,分治思想很重要(至少面试会问)
// 海量数据排序可以使用多路归并
func MergeSort(array []int)[]int  {
    //单个数据时返回,递归停止条件
    if len(array)<2{
        return array
    }

    //递归分割左右,想好递归停止的条件,分治
    mid:=len(array)/2
    left:=MergeSort(array[:mid])
    right:=MergeSort(array[mid:])
    return merge(left,right)
}

//合并两个有序链表类似的做法
func merge(left,right []int) []int {
    //额外的返回空间
    res:=make([]int,0)
    i,j:=0,0

    for i<len(left)&&j<len(right){
        //<=是稳定的关键点
        if left[i]<=right[j]{
            res = append(res,left[i])
            i++
        }else{
            res = append(res,right[j])
            j++
        }
    }

    //这里偷懒了,可以自己写详细些
    /*if i==len(left){
        res = append(res,right[j:]...)
    }else{
        res = append(res,left[i:]...)
    }*/

    //详细写法
    //left right 其中一个没有结束
    if i<len(left){
        for i<len(left){
            res = append(res,left[i])
            i++
        }
    }else{
        for j<len(right){
            res = append(res,right[j])
            j++
        }
    }

    return res
}

//希尔排序
//间隔插入排序



//堆排序   不稳定  时间复杂O(nlogn)
func HeapSort (array []int)  {
    length:=len(array)-1
    //建堆,从后向前建立堆
    for i:=len(array)/2;i>=0;i--{
        sink(array,i,length)
    }

    for i:=length;i>=0;i--{
        array[0],array[i] = array[i],array[0]
        sink(array,0,i-1)
    }
}



//下沉,堆排序最关键堆核心
//想得到从小到大的数据,需要大顶堆,最大放在结尾,最后是小到大顺序
func sink(array []int,start ,length int)  {

    for{
        next:=2*start+1
        //超出范围 退出循环
        if next>length{
            break
        }

        //找最大的值和上层互换
        if next+1<length&&array[next+1]>array[next]{
            next++
        }

        //上层已经大于下面,不用下沉,直接退出循环
        if array[start]>=array[next]{
            break
        }
        //互换后继续寻找,可能继续下沉
        array[start],array[next] = array[next],array[start]

        start = next
    }
}


func main()  {
    array:=[]int{2,1,5,8,5,6,3,2,7}
    //arra:=[]int{2,1,5,8}
    //insertSort(array,9)
    //Fast(array,0,8)
    //CreateHeap(array)
    //Inserts(array,9)

    //res:=MergeSort(array)
    HeapSort(array)
    fmt.Println(array)

    fmt.Println(array[:len(array)])

}

 

golang 排序

原文:https://www.cnblogs.com/9527s/p/14242795.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!