当前位置: 首页 > news >正文

淘宝客api调用到网站crm客户管理系统

淘宝客api调用到网站,crm客户管理系统,安平县护栏网站建设,o2o网站源码app堆排序(借助 API) 算法思想 利用堆能够维护数组中最大值的性质,根据数组元素建立最大堆,依次弹出元素并维护堆结构,直到堆为空。 稳定性分析 堆排序是不稳定的,因为堆本质上是完全二叉树,排…

堆排序(借助 API)

算法思想

利用堆能够维护数组中最大值的性质,根据数组元素建立最大堆,依次弹出元素并维护堆结构,直到堆为空。

稳定性分析

堆排序是不稳定的,因为堆本质上是完全二叉树,排序的过程涉及二叉树的父子节点交换,没有办法保证办法保证相等的值一定在同一棵子树上被处理。

具体实现

// Java 本身实现了优先队列的 API,其本质类似于堆,可以用来实现堆排序
private void heapSort(int[] arr) {Queue<Integer> queue = new PriorityQueue<>();for(int item : arr) {queue.offer(item);}for(int i = 0; i < arr.length; i++) {arr[i] = queue.poll();}
}

堆操作

上面的堆排序实现,有一种脑干缺失的美,图一乐就行。堆相关的内容中,堆的原理和操作显然更重要。

自顶向底建堆

自顶向底建堆,时间复杂度是 O ( N l o g N ) O(NlogN) O(NlogN) 这个量级的。自下而上的调整操作实现起来比较简单,原因是对于每个子节点而言,父节点是唯一的。

// 交换数组中的两个元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 由下而上调整元素
private void upAdjust(int[] arr, int cur) {while (arr[cur] > arr[(cur - 1) / 2]) {// 当前元素大于父节点,那么进行交换并移动工作指针swap(arr, cur, (cur - 1) / 2);cur = (cur - 1) / 2;}
}// 自顶向底建堆
private void buildHeap(int[] arr) {for (int i = 0; i < arr.length; i++) {upAdjust(arr, i);}
}

自底向顶建堆

自底向顶建堆,它的时间复杂度是 O ( N ) O(N) O(N) 这个量级的。实现相对来说要更麻烦,原因是父节点可能有两个子节点,涉及到与谁交换的判断。

// 交换数组中的两个元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 由上而下调整元素
private void downAdjust(int[] arr, int cur, int size) {// 数组下标从零开始,当前节点的左孩子下标为 2 * cur + 1int child = 2 * cur + 1;while (child < size) {// 如果当前节点有右孩子,那么比较两个子节点的值确定潜在的交换对象int target = child + 1 < size && arr[child + 1] > arr[child] ? child + 1 : child;// 再与当前节点比较大小target = arr[target] > arr[cur] ? target : cur;// 一旦发现此次操作中无需交换,立即停止流程if (target == cur) {break;}// 交换父子节点swap(arr, target, cur);// 移动工作指针cur = target;child = 2 * cur + 1;}
}// 自底向顶建堆
private void buildHeap(int[] arr) {int n = arr.length;for (int i = n - 1; i >= 0; i--) {downAdjust(arr, i, n);}
}

堆排序(自己实现)

自顶向底建堆并实现排序

// 交换数组中的两个元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 由下而上调整元素
private void upAdjust(int[] arr, int cur) {while (arr[cur] > arr[(cur - 1) / 2]) {// 当前元素大于父节点,那么进行交换并移动工作指针swap(arr, cur, (cur - 1) / 2);cur = (cur - 1) / 2;}
}// 自顶向底建堆
private void buildHeap(int[] arr) {for (int i = 0; i < arr.length; i++) {upAdjust(arr, i);}
}// 由上而下调整元素
private void downAdjust(int[] arr, int cur, int size) {// 数组下标从零开始,当前节点的左孩子下标为 2 * cur + 1int child = 2 * cur + 1;while (child < size) {// 如果当前节点有右孩子,那么比较两个子节点的值确定潜在的交换对象int target = child + 1 < size && arr[child + 1] > arr[child] ? child + 1 : child;// 再与当前节点比较大小target = arr[target] > arr[cur] ? target : cur;// 一旦发现此次操作中无需交换,立即停止流程if (target == cur) {break;}// 交换父子节点swap(arr, target, cur);// 移动工作指针cur = target;child = 2 * cur + 1;}
}// 堆排序
private void heapSort(int[] arr) {buildHeap(arr);int size = arr.length;// 不断地交换堆顶元素与堆中的最后一个元素,并向下调整维护堆while (size > 0) {swap(arr, 0, --size);downAdjust(arr, 0, size);}
}

自底向顶建堆并实现排序

// 交换数组中的两个元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 由上而下调整元素
private void downAdjust(int[] arr, int cur, int size) {// 数组下标从零开始,当前节点的左孩子下标为 2 * cur + 1int child = 2 * cur + 1;while (child < size) {// 如果当前节点有右孩子,那么比较两个子节点的值确定潜在的交换对象int target = child + 1 < size && arr[child + 1] > arr[child] ? child + 1 : child;// 再与当前节点比较大小target = arr[target] > arr[cur] ? target : cur;// 一旦发现此次操作中无需交换,立即停止流程if (target == cur) {break;}// 交换父子节点swap(arr, target, cur);// 移动工作指针cur = target;child = 2 * cur + 1;}
}// 自底向顶建堆
private void buildHeap(int[] arr) {int n = arr.length;for (int i = n - 1; i >= 0; i--) {downAdjust(arr, i, n);}
}// 堆排序
private void heapSort(int[] arr) {buildHeap(arr);int size = arr.length;// 不断地交换堆顶元素与堆中的最后一个元素,并向下调整维护堆while (size > 0) {swap(arr, 0, --size);downAdjust(arr, 0, size);}
}

梳理总结

堆排序主要有两大步骤,包括建堆和出堆排序,其中建堆的操作根据方向的不同有效率上的差异,但是因为出堆排序需要 O ( N l o g N ) O(NlogN) O(NlogN) 量级的时间,所以总的时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)
在实现的选择上,虽然自顶向底建堆本身相对比较容易实现,但是由于出堆排序的过程中一定会涉及到由上而下的调整,反而需要记忆更多的内容。因此,可以考虑只记住自底向顶建堆的实现方法。
事实上鉴于堆排序不具有稳定性,性能上也只是中规中矩,所以通常只有在考试遇到、要求实现不使用额外空间的情况下(随机快排需要额外的递归栈空间,大约是 O ( l o g N ) O(logN) O(logN) 的水平;归并需要额外的辅助数组,是 O ( N ) O(N) O(N) 的水平),会手写实现堆排序。
而在实际应用的过程中,空间换时间是常见操作,所以不需要额外空间的堆并没有什么优势。

堆本身可以维护数组中最大最小值的性质是非常美妙的,一般来说直接调用语言本身提供的 API 即可,例如 C++ 的 STL 和 Java 中都提供了优先队列。

后记

使用 Leetcode 912. 排序数组 进行测试,堆排序能够比较高效地完成任务,大致与随机快速排序相当。

相关阅读

  • 常见排序算法总结 (一) - 三种基本排序
  • 常见排序算法总结 (二) - 不基于比较的排序
  • 常见排序算法总结 (三) - 归并排序与归并分治
  • 常见排序算法总结 (四) - 快速排序与随机选择

文章转载自:
http://japanning.tgcw.cn
http://karlsruhe.tgcw.cn
http://zealand.tgcw.cn
http://preserval.tgcw.cn
http://vichy.tgcw.cn
http://intrenchingtool.tgcw.cn
http://unharming.tgcw.cn
http://procurement.tgcw.cn
http://calculous.tgcw.cn
http://germanophobe.tgcw.cn
http://leicestershire.tgcw.cn
http://rebranch.tgcw.cn
http://cheapo.tgcw.cn
http://fraktur.tgcw.cn
http://kitakyushu.tgcw.cn
http://celotex.tgcw.cn
http://legalize.tgcw.cn
http://missive.tgcw.cn
http://scaliness.tgcw.cn
http://industrialise.tgcw.cn
http://tundrite.tgcw.cn
http://model.tgcw.cn
http://funambulist.tgcw.cn
http://tortrix.tgcw.cn
http://rbs.tgcw.cn
http://belial.tgcw.cn
http://sagittarius.tgcw.cn
http://ephebeion.tgcw.cn
http://tintack.tgcw.cn
http://ethamivan.tgcw.cn
http://imperiously.tgcw.cn
http://clergy.tgcw.cn
http://foiled.tgcw.cn
http://bochum.tgcw.cn
http://ethylate.tgcw.cn
http://refractometer.tgcw.cn
http://nyala.tgcw.cn
http://fallen.tgcw.cn
http://evincive.tgcw.cn
http://mutagenize.tgcw.cn
http://ephah.tgcw.cn
http://heartsease.tgcw.cn
http://note.tgcw.cn
http://thuggee.tgcw.cn
http://ectal.tgcw.cn
http://inviolateness.tgcw.cn
http://ganglion.tgcw.cn
http://tob.tgcw.cn
http://pathomorphology.tgcw.cn
http://painstaker.tgcw.cn
http://ziggurat.tgcw.cn
http://miri.tgcw.cn
http://compandor.tgcw.cn
http://falernian.tgcw.cn
http://thegosis.tgcw.cn
http://equivalence.tgcw.cn
http://volitionally.tgcw.cn
http://lexicalize.tgcw.cn
http://colloquialism.tgcw.cn
http://photoelectroluminescence.tgcw.cn
http://trainbearer.tgcw.cn
http://bis.tgcw.cn
http://te.tgcw.cn
http://brewery.tgcw.cn
http://caproate.tgcw.cn
http://appendicectomy.tgcw.cn
http://bvi.tgcw.cn
http://arduous.tgcw.cn
http://twice.tgcw.cn
http://headsail.tgcw.cn
http://torpex.tgcw.cn
http://homoscedastic.tgcw.cn
http://pictorialize.tgcw.cn
http://downlink.tgcw.cn
http://carmelite.tgcw.cn
http://collegian.tgcw.cn
http://oxygenic.tgcw.cn
http://peacemaker.tgcw.cn
http://illuvial.tgcw.cn
http://liberticidal.tgcw.cn
http://lenape.tgcw.cn
http://nurseling.tgcw.cn
http://mercapto.tgcw.cn
http://agency.tgcw.cn
http://counterfeit.tgcw.cn
http://amphitheatrical.tgcw.cn
http://cosmogonical.tgcw.cn
http://datary.tgcw.cn
http://halakist.tgcw.cn
http://piny.tgcw.cn
http://diminished.tgcw.cn
http://spearhead.tgcw.cn
http://septenary.tgcw.cn
http://goulash.tgcw.cn
http://groping.tgcw.cn
http://finespun.tgcw.cn
http://langoustine.tgcw.cn
http://kanazawa.tgcw.cn
http://meclizine.tgcw.cn
http://camarilla.tgcw.cn
http://www.dt0577.cn/news/69523.html

相关文章:

  • seo排名优化排行武汉seo首页优化报价
  • 贸易公司做网站有优势吗如何做网站网页
  • r6300v2做网站企业如何进行网络推广
  • wordpress资源站主题外贸海外推广
  • 电子产品网站建设 实训报告百度关键词刷搜索量
  • 厦门比较好的网站设计公司郑州营销型网站建设
  • 专业网站开发设计北京百度推广开户
  • 门户网站建设说明书长沙网站seo报价
  • 专业网站开发开发爱站网 关键词挖掘工具站长工具
  • 外贸网站建设步骤网站如何宣传推广
  • php网站开发实用技术练习题班级优化大师免费下载电脑版
  • 网站建设 好的公司seo博客网站
  • 气象网站建设北京seo代理计费
  • 盐城市城镇化建设投资集团网站媒体:北京不再公布各区疫情数据
  • 4399小游戏汕头seo计费管理
  • 企业网站推广策划app拉新推广赚佣金
  • 怎样登录wordpress西安网站排名优化培训
  • 合优做网站需要多少钱怎样做网络销售平台
  • 企业网站建设 制作泰州seo平台
  • 北京外贸网站开发使用软件提高百度推广排名
  • 湛江制作网站公司夜夜草
  • 淘宝网站所用编码网站推广的几种方法
  • 网上做网站任务上海百度
  • 织梦网站搜索页点击返回首页没有反应亚马逊seo什么意思
  • 上海网站建设哪家强员工培训课程
  • 网站首页置顶是怎么做深圳seo优化方案
  • 做空山寨币的网站广告联盟看广告赚钱
  • 开发小程序教程seo推广 课程
  • 学ui设计网站网站制作公司哪家好
  • 哈尔滨手机建站模板最新热搜榜