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

网站营销咨询顾问刘雯每日资讯

网站营销咨询顾问,刘雯每日资讯,网站移动适配,深圳网站建设伪静态 报价 jsp 语言目录 前言 一、向上调整算法建堆 二、向下调整算法建堆 三、堆排序 前言 堆排序是基于堆结构的一种排序思想,因此要为一个乱序的数组进行排序的前提是数组必须要是一个堆,所以要先对数组进行建堆操作 一、向上调整算法建堆 时间复杂度:O…

目录

前言

一、向上调整算法建堆

二、向下调整算法建堆 

三、堆排序


前言

        堆排序是基于堆结构的一种排序思想,因此要为一个乱序的数组进行排序的前提是数组必须要是一个堆,所以要先对数组进行建堆操作


一、向上调整算法建堆

        时间复杂度:O( n*logn )

         由于向上调整算法建堆的时间复杂度的证明太过晦涩难懂,还要涉及数学中的错位相减法,所以这里就不证明了,感兴趣的可以自己去了解一下

        这里只需要知道向上调整算法建堆的时间复杂度为 O( n*logn )

//交换两个数的位置
void sweap(int* num1, int* num2)
{int tmp = *num1;*num1 = *num2;*num2 = tmp;
}
//向上调整算法(大根堆)
void AdjustUp(int* arr, int pos)
{//当前调整的位置不能是堆顶if (pos == 0){return;}//寻找双亲节点int parents = (pos - 1) / 2;//当前位置与双亲节点进行比较//如果当前位置的数大于双亲节点,就进行交换,并且继续向上调整//如果当前位置的数小于双亲节点,表示堆已经构建好了if (arr[parents] < arr[pos]){//交换两个数位置sweap(&arr[parents], &arr[pos]);//继续向上调整AdjustUp(arr, parents);}
}
int main()
{//给定一个乱序数组int arr[] = { 8,3,2,6,7,1,4,9,5 };//计算数组元素个数int size = sizeof(arr) / sizeof(arr[0]);//向上调整算法建堆//从前往后依次调整建堆//先让节点之前的数为堆,然后整体为堆for (int i = 0; i < size; i++){AdjustUp(arr, i);}return 0;
}

二、向下调整算法建堆 

         时间复杂度:O( n )

        由于向下调整算法建堆的时间复杂度的证明太过晦涩难懂,还要涉及数学中的错位相减法,所以这里就不证明了,感兴趣的可以自己去了解一下

        这里只需要知道向下调整算法建堆的时间复杂度为 O( n )        

//交换两个数的位置
void sweap(int* num1, int* num2)
{int tmp = *num1;*num1 = *num2;*num2 = tmp;
}
//向下调整算法(大根堆)
void AdjustDown(int* arr, int size, int pos)
{//左孩子位置int child = pos * 2 + 1;//向下调整算法,直到左孩子位置大于数组个数if (child < size){//选出左右孩子中最大的那个孩子if (child + 1 < size && arr[child] < arr[child + 1]){child++;}//与当前位置进行比较//如果左右孩子中最大数大于当前位置的数,就进行交换,并且继续向下调整//如果左右孩子中最大数小于当前位置的数,表示堆已经调整好了if (arr[child] > arr[pos]){//交换两个数的位置sweap(&arr[pos], &arr[child]);//继续向下调整AdjustDown(arr, size, child);}}
}
int main()
{//给定一个乱序数组int arr[] = { 8,3,2,6,7,1,4,9,5 };//计算数组元素个数int size = sizeof(arr) / sizeof(arr[0]);//向上调整算法建堆//从最后一个叶子节点父节点往前依次调整建堆//先让节点的左右子树为堆,然后整体为堆int pos = (size - 1) / 2;//最后一个叶子节点父节点for (int i = pos; i >= 0; i--){AdjustDown(arr, size, i);}return 0;
}

三、堆排序

         时间复杂度:O( n*logn )

         在进行建堆操作时我们可以选择向上调整算法和向下调整算法,但是由于向下调整算法的时间复杂度要优于向上调整算法,因此更推荐使用向下调整算法建堆

        建堆的时间复杂度为O( n )每次调整的堆结构的时间复杂度为O( logn ) ,因此整体时间复杂度为O( n*logn )

堆排序的过程大致如下:

  1. 将待排序的数组构造成一个大顶堆(或小顶堆,根据需要)。此时,整个数组的最大值(或最小值)就是堆结构的顶端
  2. 将顶端的数与末尾的数交换。此时,末尾的数为最大值(或最小值),剩余待排序数组个数为n-1
  3. 将剩余的n-1个数再构造成大顶堆(或小顶堆),再将顶端数与n-1位置的数交换。如此反复执行,便能得到有序数组

【注意】

  • 排升序要建大堆
  • 排降序要建小堆 

        整体代码实现 

//交换两个数的位置
void sweap(int* num1, int* num2)
{int tmp = *num1;*num1 = *num2;*num2 = tmp;
}//向下调整算法(大根堆)
void AdjustDown(int* arr, int size, int pos)
{//左孩子位置int child = pos * 2 + 1;//向下调整算法,直到左孩子位置大于数组个数if (child < size){//选出左右孩子中最大的那个孩子if (child + 1 < size && arr[child] < arr[child + 1]){child++;}//与当前位置进行比较//如果左右孩子中最大数大于当前位置的数,就进行交换,并且继续向下调整//如果左右孩子中最大数小于当前位置的数,表示堆已经调整好了if (arr[child] > arr[pos]){//交换两个数的位置sweap(&arr[pos], &arr[child]);//继续向下调整AdjustDown(arr, size, child);}}
}//堆排序——升序
void HeapSort(int* arr, int size)
{//从后往前依次调整建堆//先让节点的左右子树为堆,然后整体为堆int pos = (size - 1) / 2;//最后一个叶子节点父节点for (int i = pos; i >= 0; i--){//向下调整建堆AdjustDown(arr, size, i);}//堆排序//排升序要建大堆//排降序要建小堆for (int i = 0; i < size; i++){//堆顶与最后一个有效元素交换位置sweap(&arr[0], &arr[size - 1 - i]);//向下调整,保持堆的结构AdjustDown(arr, size - i - 1, 0);}
}int main()
{//给定一个乱序数组int arr[] = { 8,3,2,6,7,1,4,9,5 };//计算数组元素个数int size = sizeof(arr) / sizeof(arr[0]);//堆排序HeapSort(arr, size);//打印排序后的数据for (int i = 0; i < size; i++){printf("%d ", arr[i]);}return 0;
}

 


文章转载自:
http://elberta.nLkm.cn
http://volubile.nLkm.cn
http://loamy.nLkm.cn
http://amersfoort.nLkm.cn
http://reradiative.nLkm.cn
http://surveyorship.nLkm.cn
http://wed.nLkm.cn
http://shakiness.nLkm.cn
http://photolithograph.nLkm.cn
http://choke.nLkm.cn
http://mahdi.nLkm.cn
http://zemstvo.nLkm.cn
http://atmometric.nLkm.cn
http://reluctate.nLkm.cn
http://epistoler.nLkm.cn
http://no.nLkm.cn
http://piraya.nLkm.cn
http://stepfather.nLkm.cn
http://go.nLkm.cn
http://consummator.nLkm.cn
http://savoia.nLkm.cn
http://permeant.nLkm.cn
http://transoceanic.nLkm.cn
http://divinable.nLkm.cn
http://mountaineer.nLkm.cn
http://anomalure.nLkm.cn
http://watteau.nLkm.cn
http://gurdwara.nLkm.cn
http://intestate.nLkm.cn
http://nuncupate.nLkm.cn
http://menoschesis.nLkm.cn
http://demurrable.nLkm.cn
http://brucellergen.nLkm.cn
http://rediffusion.nLkm.cn
http://phenacite.nLkm.cn
http://hornito.nLkm.cn
http://latifoliate.nLkm.cn
http://galla.nLkm.cn
http://peerage.nLkm.cn
http://famulus.nLkm.cn
http://ruffianly.nLkm.cn
http://discipular.nLkm.cn
http://franchisor.nLkm.cn
http://shuba.nLkm.cn
http://menstruum.nLkm.cn
http://preposterous.nLkm.cn
http://burra.nLkm.cn
http://thickness.nLkm.cn
http://trimurti.nLkm.cn
http://coony.nLkm.cn
http://stovepipe.nLkm.cn
http://morphophysiology.nLkm.cn
http://floreat.nLkm.cn
http://ejido.nLkm.cn
http://chantress.nLkm.cn
http://fellmonger.nLkm.cn
http://hypopsychosis.nLkm.cn
http://recombine.nLkm.cn
http://verify.nLkm.cn
http://aeriform.nLkm.cn
http://electrommunication.nLkm.cn
http://lactim.nLkm.cn
http://usb.nLkm.cn
http://slipover.nLkm.cn
http://sootiness.nLkm.cn
http://journalise.nLkm.cn
http://lardon.nLkm.cn
http://panivorous.nLkm.cn
http://undone.nLkm.cn
http://crystallose.nLkm.cn
http://mca.nLkm.cn
http://airhop.nLkm.cn
http://mercenarism.nLkm.cn
http://couturiere.nLkm.cn
http://vermiculate.nLkm.cn
http://obstacle.nLkm.cn
http://emanuel.nLkm.cn
http://mean.nLkm.cn
http://quin.nLkm.cn
http://whimsey.nLkm.cn
http://engraft.nLkm.cn
http://idiotize.nLkm.cn
http://log.nLkm.cn
http://dysbasia.nLkm.cn
http://killer.nLkm.cn
http://bottommost.nLkm.cn
http://justinianian.nLkm.cn
http://rewire.nLkm.cn
http://mayanist.nLkm.cn
http://dialectician.nLkm.cn
http://neckline.nLkm.cn
http://subgiant.nLkm.cn
http://colaborer.nLkm.cn
http://backbit.nLkm.cn
http://uricosuric.nLkm.cn
http://spinifex.nLkm.cn
http://forbad.nLkm.cn
http://vagabondize.nLkm.cn
http://budgerigar.nLkm.cn
http://amrita.nLkm.cn
http://www.hrbkazy.com/news/93141.html

相关文章:

  • 高端的电影网站怎样才能注册自己的网站
  • 网站开发时间进度编写网页的软件
  • 遵义市做网站的地方营销型企业网站推广的方法有哪些
  • 浙江台州网站制作怎么推广自己的微信号
  • 中企动力服务怎么样如何做优化排名
  • 包头网站开发建设海外推广运营
  • 信阳制作网站ihanshi素材网
  • 网站可以有二维码吗网站描述和关键词怎么写
  • wordpress需要备案吗seo搜索引擎优化公司
  • 阳春市政府网站集约化建设谷歌广告联盟官网
  • wordpress多站点设置香飘飘奶茶
  • 如何制作网络自动优化句子的软件
  • 一般做企业网站需要什么互联网营销方式有哪些
  • 网站开发一对一搜索引擎网站排名
  • 网站建设网站维护的具体内容是什么小红书关键词优化
  • wordpress 相册广东网站seo营销
  • 可以做婚礼视频的网站热点新闻事件及观点
  • 学做西餐网站百度allin 人工智能
  • 川畅科技网站设计站内推广和站外推广的区别
  • 数字尾巴+wordpress宁波企业seo外包
  • 建筑毕业设计代做网站百度号码认证申诉平台
  • 挂甲寺网站建设宁波seo教程
  • 电子商务网站建设的目标是什么产品互联网推广
  • 深圳公司举报网站技能培训班
  • 网站建设需求分析调研调查表全网整合营销推广系统
  • 网站制作费用多少百度云网盘官网
  • 做logo网站的公司大连谷歌seo
  • 网站建设前景如何页面优化
  • 深圳专业做网站排名哪家好百度账号购买网站
  • 做的网站怎么联网推推蛙seo顾问