n*log(3)n排序算法 初稿

 
在看文章之前,请先熟悉堆排序:http://blog.csdn.net/morewindows/article/details/6709644/
假如你熟悉了,那么现在讲的是一个和二叉堆排序同类算法,也是堆排序.只是形式上变化了一下, 还可以降低, 但是有个极限,极限其实是一个函数方程解,是深度和长度,设排序数量为n(n>k),采用k叉树排序(k>=2),深度为d有有关系式d=log(k)n,d*k+1<=n<=d*k+k,复杂度计算公式d*k,具体应该是log(k)2+log(k)3+...+log(k)n+(k-1)*log(k)n+...+(k-1)*log(k)2,表达式中的log都是向上取整可以对其合并求导,只剩一步求解了

以下是该树的性质:
1.	父节点都不小于子节点.
以下是推导出的性质
1.节点k的子孩子是3k+1,3k+2,3k+3

建树过程:
从根节点的第一个子节点开始.和父节点比较,如果父节点小于子节点,则交换.交换后若依然有父节点小于子节点,继续交换.依次对所有节点进行调整操作. 第一步log(3)2向上取整第二步是log(3)3向上取整…∑「log(3)k()」(k=1,…,n),可以推导出o(n)<n*log(3)n
排序过程:
取根节点,把最后一个子节点放入根节点,树不再满足原来的性质,若最大子节点大于父节点则交换.循环至树为空. 第一步3*log(3)k向上取整第二步是3*log(3)(k-1)向上取整…∑「log(3)k」(k=1,…,n),可以推导出o(n)<3n*log(3)n


package main
import (
"fmt"
 "math/rand"
"math"
)
const(
ARRAYLENTH=20
)
 
var array [ARRAYLENTH]int
var newArray [ARRAYLENTH]int
func  main(){
    for i:=0;i<ARRAYLENTH;i++{
        array[i]=rand.Intn(100)
        
    }
 
    fmt.Println("初始:")
    print()
    initArray()
    fmt.Println("建树后:")
    print
    sort()
    fmt.Println("排序后:")
    for i:=0;i<ARRAYLENTH;i++{
        fmt.Print("    ",newArray[i])
 
    }
 
}
func print( ){
    k:=1
    fmt.Println("")
    for i:=0;i<ARRAYLENTH;i++{
        fmt.Print(array[i],"   ")
    }
    fmt.Println("   ")
    
    for i:=0;i<ARRAYLENTH;i++{
        if i*2>=int(math.Pow(float64(3),float64(k-1))-1){
            fmt.Print("\n第",k,"层:")
            k++
        }
        fmt.Print(array[i],"   ")
    }
}
func initArray( ){
    for index:=1;index<ARRAYLENTH;index++{
        if array[index]>array[(index-1)/3]{
            createTreeAdjust(index)
        }
    }
}
func createTreeAdjust(index int){
    for ;index!=0;{
        if array[index]>array[(index-1)/3]{
            tmp:=array[index]
            array[index]=array[(index-1)/3]
            array[(index-1)/3]=tmp
        }else{
            return
        }
        index=(index-1)/3
    }
}
func sort( ){
    
    index:=0
    for count:=ARRAYLENTH;count>0;count--{
        newArray[index]=array[0]
        array[0]=array[count-1]
        sortAdjust(count-1)
        index++
    }
}
func sortAdjust(count int){
    if count==0{return}
    index:=0
     max:=0
    for ;3*index+3<count;{
        max=3*index+1
        if array[max]<array[3*index+2]{
            max=3*index+2
        }
        if array[max]<array[3*index+3]{
            max=3*index+3
        }
		if array[index]>array[max]{
			return
		}
        tmp:=array[index]
        array[index]=array[max]
        index=max
        array[index]=tmp
    }
    if index==count-1{return}
    if 3*index+2>count{return}
    max=count-1
    if array[max]<array[count-2]&&((count-3)/3==index){
        max=count-2
    }
    tmp:=array[index]
    array[index]=array[max]
    array[max]=tmp
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值