算法导论——六、七章

第六章:堆排序

堆数据结构其实就是完全二叉树,可以用线性数组表示,但该数组A需要有两个属性:length[A]  heap-size[A],分别表示A元素个数,

以及堆中元素个数。

求亲戚节点号:父亲是 └ i/2 ┘ 左儿子:2*i 右儿子 2*i +1

最大堆、最小堆则分别表示父亲是大还是小

堆排序:首先建立最大堆,然后根节点(有最大值)与末尾节点交换,然后将堆的大小减一,调整堆,再循环

HEAP-SORT(A){// O(n lg n)

    BUILD-MAX-HEAP(A);

    for(i = length[A]; i > 1; i --){

        exchange A[1], A[i]

        heap-size[A] --;

        MAX-HEAPIFY(A,1);

    }

}

BUILD-MAX-HEAP(A){//建立堆,└ length[A]/2 ┘后面都是叶子,没有孩子,无需调整        O(n)

     heap-size[A] = length[A];

     for (i = └ length[A]/2 ┘ ; i >0; i--){

         MAX-HEAPIFY(A,i);

     }

}

MAX-HEAPIFY(A,i){//只有i节点不符合性质,与自己的孩纸交换调整          O(lg n)

      m = left(i);

       n = right(i);

       if(m <= heap-size[A] && A[i] < A[m])

               largest = m;

       else  largest = i;

       if(n <= heap-size[A] && A[largest] < A[n]

                largest = n;

       if(largest != i){

                exchange A[i],A[largest];

                MAX-HEAPIFY(A,largest);

       }

}

第七章:快速排序

也是分治法,比较简单,不多说。

QUICK-SORT(A, p , r){

       if( p  <  r){

              q = PARTITION(A, p, r);

              QUICK-SORT(A, p , q);

              QUICK-SORT(A, q + 1 , r);

       }

}

PARTITION(A , p , r){

     x = A [r];

     i = p;

     for( j = p ; j <= r - 1; j ++){

            if(A[j] <= x ){ exchange A[i], A[j] ;      i ++;}

     }

     exchange A[i], A[r]

     return i;

}

最坏情况 O(n²). 平均情况O(n lg n)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值