堆排序

时间复杂度:O(n*logn)  以2为底的对数

空间复杂度:O(1)

稳定性:不稳定


        /// <summary>
        /// 堆排序
        /// </summary>
        /// <param name="nums">待排数据</param>
        public void Sort(int[] nums)
        {
            //基本思路:第1轮 将全部元素调整为大根堆,将根节点和最后一个元素交换
            //             第2轮 将除了最后一个元素外的元素调整为大根堆, 将根节点和倒数第二个元素交换
            //           。。。。。
            //将所有元素调整为大根堆  由于Heapify的使用限制  所以从最后一个非叶子节点开始调整
            //n个节点完全二叉树   下标0-n/2-1为非叶子节点
            for (int i = nums.Length / 2 - 1; i >= 0; i--)
            {
                Heapify(nums, i, nums.Length);
            }
            //需要调换n-1次
            for (int i = 0; i < nums.Length - 1; i++)
            {
                //将根和倒数第x个元素调换
                int tmp = nums[0];
                nums[0] = nums[nums.Length - i - 1];
                nums[nums.Length - i - 1] = tmp;
                //将前面的继续调整为大根堆  后面已经有序的除外
                Heapify(nums, 0, nums.Length - i - 1);
            }
        }


        /// <summary>
        /// 调整大根堆
        /// 使用前提:rootIndex的子节点的子树为空或者为大根堆   
        /// 该方法调整rootIndex根   可能会将子节点中大的和根交换  如果其子节点的子树为空则仍符合大根堆 
        /// 如果子节点的子树为大根堆  则调整后和根节点互换的子节点的子树不符合大根堆  方法会继续循环调整   另一个子节点仍符合大根堆
        /// 但是如果其子节点的子树不是大根堆  该方法只能调整和根节点互换的子节点的子树  另一个无法保证
        /// </summary>
        /// <param name="nums">待排序列</param>
        /// <param name="rootIndex">要调整的根节点下标</param>
        /// <param name="length">大根堆中的节点个数</param>
        void Heapify(int[] nums, int rootIndex, int length)
        {
            //下标从0开始   则rootIndex的左孩子  2*rootIndex+1
            int lchild;
            //判断孩子是否存在  并判断和谁交换(较大的交换)
            while ((lchild = 2 * rootIndex + 1) < length)
            {
                //左右孩子比较  确定较大的孩子
                if (lchild + 1 < length && nums[lchild] < nums[lchild + 1])
                {
                    lchild++;//lchild为要和根交换的
                }
                if (nums[rootIndex] < nums[lchild])
                {
                    //交换
                    int tmp = nums[lchild];
                    nums[lchild] = nums[rootIndex];
                    nums[rootIndex] = tmp;
                    //将lchild看做根  继续判断   因为以该节点为根的树可能不符合条件  
                    rootIndex = lchild;
                }
                else
                {
                    //如果符合大根  则退出
                    break;
                }
            }
        }



内容概要:文章详细介绍了ETL工程师这一职业,解释了ETL(Extract-Transform-Load)的概念及其在数据处理中的重要性。ETL工程师负责将分散、不统一的数据整合为有价值的信息,支持企业的决策分析。日常工作包括数据整合、存储管理、挖掘设计支持和多维分析展现。文中强调了ETL工程师所需的核心技能,如数据库知识、ETL工具使用、编程能力、业务理解能力和问题解决能力。此外,还盘点了常见的ETL工具,包括开源工具如Kettle、XXL-JOB、Oozie、Azkaban和海豚调度,以及企业级工具如TASKCTL和Moia Comtrol。最后,文章探讨了ETL工程师的职业发展路径,从初级到高级的技术晋升,以及向大数据工程师或数据产品经理的横向发展,并提供了学习资源和求职技巧。 适合人群:对数据处理感兴趣,尤其是希望从事数据工程领域的人士,如数据分析师、数据科学家、软件工程师等。 使用场景及目标:①了解ETL工程师的职责和技能要求;②选择适合自己的ETL工具;③规划ETL工程师的职业发展路径;④获取相关的学习资源和求职建议。 其他说明:随着大数据技术的发展和企业数字化转型的加速,ETL工程师的需求不断增加,尤其是在金融、零售、制造、人工智能、物联网和区块链等领域。数据隐私保护法规的完善也使得ETL工程师在数据安全和合规处理方面的作用更加重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值