快速排序

func sortArray(nums []int) []int {
    var quick_sort func(nums []int,l,r int)
    quick_sort=func(nums []int,l,r int){
        if l>=r{
            return 
        }
        //这x取l、r、(l+r)>>1都行。下面用i来区分边界的时候,这不能写l!!!!否则有边界问题,会死循环,死循环样例1 2
        x,i,j:=nums[l],l-1,r+1

        for i<j{
            //golang模拟do while写法
            // var _tk=true
            // for _tk||nums[i]<x{
            //     _tk=false
            //     i++
            // }
            for i++;nums[i]<x;{
                i++
            }
            for j--;nums[j]>x;{
                j--
            }
            if i<j{
                nums[i],nums[j]=nums[j],nums[i]
            }
        }
        //或者
        // quick_sort(nums,l,i-1)
        // quick_sort(nums,i,r)
        
        quick_sort(nums,l,j)
        quick_sort(nums,j+1,r)
    } 
    quick_sort(nums,0,len(nums)-1)
    return nums
}
  • 时间复杂度:平均情况O(nlogn),最好O(nlogn),最坏O(n^2)
  • 最佳情况:T(n) = O(nlogn),快速排序最优的情况就是每一次取到的元素都刚好平分整个数组
  • 最差情况:T(n) = O(n²),最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)
  • 平均情况:T(n) = O(nlogn)
  • 稳定性:不稳定

归并排序

func sortArray(nums []int) []int {
    t:=make([]int,len(nums))
    var MergeSort func(l,r int)
    MergeSort=func(l,r int){
        if l>=r{
            return 
        }
        
        mid:=(l+r)>>1
        MergeSort(l,mid)
        MergeSort(mid+1,r)
        i,j,k:=l,mid+1,0
        for i<=mid&&j<=r{
           if nums[i]<nums[j]{
               t[k]=nums[i]
               i,k=i+1,k+1
           }else{
               t[k]=nums[j]
               j,k=j+1,k+1
           }
        }
        for ;i<=mid;i,k=i+1,k+1{
            t[k]=nums[i]
        }
        for ;j<=r;j,k=j+1,k+1{
            t[k]=nums[j]
        }
        for i,k=l,0;i<=r;i,k=i+1,k+1{
            nums[i]=t[k]
        }
    }
    MergeSort(0,len(nums)-1)
    return nums
}
  • 时间复杂度:最好最坏平均都是O(nlogn)

总结

01

原文地址:http://www.cnblogs.com/JujunWang/p/16910585.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性