C# 堆排序

“堆”定义

  n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):

  (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子
  若将此序列所存储的向量R[1..n]看做是一棵 完全二叉树 的存储结构,则堆实质上是满足如下性质的完全二叉树:
   树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。

时间复杂度:O(nlogn)

堆排序是就地排序,辅助空间为O(1),


C# Code:

public void HeapSort(int[] arr)

        {

//针对非叶子结点进行调整
            int i = arr.Length / 2 - 1;

            while (i >= 0)
            {
                HeapAdjust(arr, i, arr.Length);
                i--;
            }

            i = arr.Length - 1;
            int temp = 0;

            for (i = arr.Length - 1; i > 1; --i)
            {
                temp = arr[i];
                arr[i] = arr[0];
                arr[0] = temp;

                HeapAdjust(arr, 0, i - 1);
            }  
        }


        private void HeapAdjust(int[] arr, int cur, int arrLeng)

        {
            int temp, child;
            int i = arrLeng;
            temp = arr[cur];
            child = 2 * cur + 1;


            while (child < arrLeng)
            {
                if (child < arrLeng && arr[child] <= arr[child + 1])
                    child++;

                if (temp > arr[child])
                    break;

                arr[cur] = arr[child];
                cur = child;
                
                child = 2 * child + 1;
            }
            arr[cur] = temp; 
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值