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

没有面板的服务器怎么建设网站销售网站免费模板

没有面板的服务器怎么建设网站,销售网站免费模板,野花高清中文免费观看视频,100个网络营销案例之前学习了堆,堆的一棵以顺序结构存储的完全二叉树,堆本身又氛围大根堆和小根堆,假设以大根堆为例,由于堆顶部元素是一棵二叉树里面最大的元素,所以如果每次都取堆顶的元素,那么取出的元素就是一个降序排列…

  之前学习了堆,堆的一棵以顺序结构存储的完全二叉树,堆本身又氛围大根堆和小根堆,假设以大根堆为例,由于堆顶部元素是一棵二叉树里面最大的元素,所以如果每次都取堆顶的元素,那么取出的元素就是一个降序排列的序列。至此,我们发现了一个堆的特别重要的一个应用,就是堆排序。


目录

1  问题解析

2  算法分析

3  代码 

4  时空复杂度分析

(1) 时间复杂度

(2) 空间复杂度


1  问题解析

  堆排序顾名思义就是用堆结构来实现对一个数组的排序,但是在排序过程中是不能使用堆这个数据结构的。如:有一个数组 a[] = {2, 4, 10, 9,  2,  3},通过堆排序这个排序算法之后,数组 a 里面的数据变为了 a[] = {2, 2, 3, 4, 9, 10} 升序排列;或者是 a[]  = {10, 9, 4, 3, 2, 2} 降序排列。


2  算法分析

  该算法共分为两步:

  1) 首先对于给定的一个数组,数组里面的数据都是乱序的,既然是堆排序,我们就需要先让该数组里面的数据变成一个堆,将数组中的数据变成一个堆的算法为(这里是建大堆,建小队逻辑类似):
  这里利用的是向下调整算法,因为向下调整算法的时间效率是比向上调整算法的时间效率高的(上一篇文章有所讲解),而向下调整算法又需要其左右子树各自都是一个堆,所以首先选择最后一个节点作为孩子节点,让其父亲向下调整,这样最后一棵子树就变成了一个堆,然后再以当前孩子节点的上一个节点作为下一个孩子节点,让其父亲向下调整,直至所有的子树都被调整为了一个堆。该过程如图所示:

 

其本质就是从最小的一个子树建堆,然后使子树规模依次扩大,最后扩大为整棵树。

  2)数组建完堆之后,由于堆顶数据总是最大的,所以我们选择让堆顶数据和最后一个节点的数据进行交换,这样最后一个数据就是有序的,然后让交换后的堆顶数据再向下建堆,但是注意这次建堆的范围应是 n - 1 个数据(n 为数组中数据的个数);那么当前我们执行完 n - 1 次该操作之后,最大的 n - 1 个数据就会被升序的放到后 n - 1 个位置,所以就实现了升序排列。该算法如图所示:

  通过理解该算法,如果要排升序的话,那么应该建大堆;排降序的话,应该建小堆。


3  代码 

//升序的话,建大堆;降序的话,建小堆
//这里升序排列
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}void AdjustDown(int* arr, int parent, int n)
{int child = 2 * parent + 1;while (child < n){if (arr[child + 1] > arr[child] && child + 1 < n){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}else{break;}}
}//Heap是堆的意思,Sort是排序的意思
void HeapSort(int* arr, int n)
{//先用所给的数组向下调整建一个堆for (int i = (n-1-1)/2;i >= 0;i--){AdjustDown(arr, i, n);}//然后每次交换堆顶元素和最后一个元素,让剩余元素建大堆int end = n;while (end > 0){//先交换Swap(&arr[0], &arr[--end]);//然后剩下元素建大堆AdjustDown(arr, 0, end);}
}

测试用例:

void Test()
{int arr[] = { 10, 9, 2, 4, 6, 11, 56, 20, 15, 19};int n = sizeof(arr) / sizeof(arr[0]);HeapSort(arr, n);for (int i = 0; i < n; i++){printf("%d ", arr[i]);}
}int main()
{Test();return 0;
}

4  时空复杂度分析

(1) 时间复杂度

  在上一篇文章中,我们分析了向下调整算法的时间复杂度为 O(logn) 的,而在堆排序里面共有两次循环,第一次循环会执行 n/2 - 1 次,第二次循环会执行 n 次,而这两次循环里面都嵌套了向下调整算法,所以时间复杂度为 O( (n/2 - 1)*logn + nlogn),去除常数项和低阶项,堆排序时间复杂度就是 O(nlogn)的。

(2) 空间复杂度

  由于堆排序算法仅用了几个变量,并为额外开辟空间,所以空间复杂度为 O(1)。


文章转载自:

http://ZwA9nOP9.kfLzy.cn
http://COgk4AZC.kfLzy.cn
http://ODZaOBod.kfLzy.cn
http://sRix4awY.kfLzy.cn
http://tIA3qfBB.kfLzy.cn
http://4QnvGFHy.kfLzy.cn
http://SVE71J3M.kfLzy.cn
http://BYvGQJXn.kfLzy.cn
http://7tYzg8ev.kfLzy.cn
http://xRP1M8NI.kfLzy.cn
http://vm4erYPC.kfLzy.cn
http://kb2Ke3Y8.kfLzy.cn
http://qAyPUGeZ.kfLzy.cn
http://pKFFUjA1.kfLzy.cn
http://wkHm9gbe.kfLzy.cn
http://tta1sJzH.kfLzy.cn
http://L3ZoR2KI.kfLzy.cn
http://N2swsJWm.kfLzy.cn
http://kOFCwEz1.kfLzy.cn
http://A9KOUGKB.kfLzy.cn
http://PNQMn4PI.kfLzy.cn
http://VWBg3Hkd.kfLzy.cn
http://pd2xrcnF.kfLzy.cn
http://MH53GGvH.kfLzy.cn
http://OwviXxE2.kfLzy.cn
http://DNwDnsUi.kfLzy.cn
http://DqOG8c4Y.kfLzy.cn
http://MyfLd40g.kfLzy.cn
http://PSyQ2dWl.kfLzy.cn
http://korfjeAI.kfLzy.cn
http://www.dtcms.com/wzjs/651572.html

相关文章:

  • 广东广州免费建站在建设一个公司网站多少钱
  • 厦门建网站费用一览表浙江网络公司排名
  • 孝感网站开发选优搏wordpress更改登录
  • 装修公司网站建设的意义公共体育课程网站建设
  • 天水市住房和城乡建设局网站礼品做便宜的网站
  • 网站开发报价合同株洲静默三天
  • 胶州做网站京东商城网站的搜索引擎营销做的案例分析
  • 百度网站前三名权重一般在多少晋城网站制作公司怎么选
  • 北京建设部官方网站证书查询三亚发布最新消息
  • 做python一个网站苏州网站建设企业网站制作
  • php网站建设基本流程廊坊百度seo公司
  • 大方泳嘉网站建设怎么在网上找做网站的客户
  • 做烘培网站烟台做网站的价格
  • 深圳福田最大网站公司wex5可以做网站吗
  • 成品网站建设哪家好品牌网图片新闻2003年下一条文章
  • 专门做图片的网站建一个公司网站要多少钱
  • 新余做网站公司asp企业网站设计
  • 重庆网站建设入门培训野望王绩翻译
  • 网站建筑设计网站页面建设需要ps吗
  • 唐山网站建设托管林芝企业网站建设公司
  • 南京市城市建设档案馆网站wordpress 编辑器 代码高亮
  • 深圳企业营销型网站建设上海市住房和城乡建设部网站
  • 自己做的网站是怎么赚钱网址网页网站的区别??
  • 东莞企业营销型网站建设app首页设计效果图
  • 商城网站htmliis7 网站权限
  • 酒店门户网站建设背景广州网站制作方法
  • 玉溪市住房和建设局公布网站微网站做的比较好的
  • 湖州北京网站建设网站如何进行优化
  • 广告行业网站建设方案ae素材网
  • 邵东网站开发湖南营销型网站建设