C# 堆排序

来源:互联网 发布:新手怎样做好淘宝网店 编辑:程序博客网 时间:2024/05/07 14:16

“堆”定义

  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; 
        }


原创粉丝点击