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