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

C--四种排序方法的补充

上一篇文章因为时间原因只写了三种,这一篇来补充第四种,第四种的代码更多,所需要理解的也是更多的。

堆排序

想要学会堆排序,你必须了解二叉树的内容。堆排序的排序速度也是非常的快。

这里都已大堆为例

1.向上调整算法(此代码适合大堆)

/*向上调整算法*/
void xiangshang(int *a,int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[parent] < a[child]){int c;c = a[parent];a[parent] = a[child];a[child] = c;}/*else{break;}*/child = parent;parent = (child - 1) / 2;}
}

(想要不屏蔽掉这个else的前提是这个二叉树已经建好了大堆,否则会出现错误。) 

我们可以通过这个图来理解(这里我已经建好了大堆)

【应该知道的小常识:父亲节点=(子节点-1)/2】 

     这里我在最后插入了11,那么11就会与他的父亲节点也就是6进行比较,如果子节点比父亲节点大的话,就会进行交换,一直到父亲节点比11大或者11一直交换到根才停止。

     while循环的结束条件是child>0的原因:假设你插入的数字会一直比较到根节点,并且比根节点还大,那么在最后一次循环开始,parent是为0的,而child为1或2,那么在这次循环结束后child会变成0,parent也为0,没有比较的必要了。

     这里可能有人写child>=0,这个也是成立的,只不过他的退出循环是因为else来退出的循环

当然你要进行堆排序的时候就别写这个了

2.建堆

/*建堆*/
void jiandui(int *b,int n)
{for (int i = 0; i < n; i++){xiangshang(b, i);}
}

这里我运用循环,你每次传一个数值,我便通过一次向上调整来形成大堆 

 

3.向下调整算法

/*向下调整算法*/
void xiangxia(int* a,int n,int parent)
{int child = parent * 2 + 1;while (child < n){if ((child + 1) < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){int c;c = a[child];a[child] = a[parent];a[parent] = c;}parent = child;child = parent * 2 + 1;}
}

【需要记住中左child=2*parent+1,右child=2*parent+2】 

 

  在这里我先假设child为左边的,让左右孩子比较,这是如果右边大,child++会使得child为右孩子。在与父亲比较进行比较。

4.堆排序

void duipaixu(int* a, int n)
{int end = n-1;jiandui(a, n);while (end){int c;c = a[0];a[0] = a[end];a[end] = c;end--;xiangxia(a, end, 0);}}

   我先通过jiandui函数来建立大堆,这样便是最大的值,让最后一个叶子节点进行交换,这时最后一个是最大的值,让end--,是为了不让下面代码的向下调整算法对我刚调整的最大值改变位置,然后用向下调整算法找到第二大的数放在了根的位置,然后交换位置后,倒数第二个便是倒数第二个最大的,依次进行,那么在数组中就会形成升序。

 

 


http://www.mrgr.cn/news/16200.html

相关文章:

  • 足底筋膜炎怎么治疗效果好
  • 掌握AIGC的魔法:编写高质量提示词的艺术与科学
  • 【C++11及其特性】左值和右值
  • 高级字符串算法
  • 算法设计与分析:实验四 动态规划—鸡蛋掉落问题
  • Java之初始泛型
  • Android 15 大变更:支持 16K 内存分页,所有 native app 必须重编译~
  • 第六课,模运算进阶,计算机存储单位
  • 运用Premiere自学视频剪辑,这些岗位你能胜任!
  • 等保2.0--安全计算环境--TiDB数据库
  • 微服务优缺点以及如何拆分
  • YOLOv9独家改进:一种高效移动应用的卷积加性自注意Vision Transformer
  • 技术周总结08.26-09.01(软件架构)
  • 麦弗逊悬架KC特性分析APP开发与应用
  • 渐进式衰老?医美三剑客的“市梦率”幻灭了
  • 干货分享|分享一款自己常用的桌面整理神器 WPS桌面整理
  • 点击消除:删除连续重复的字符
  • 信息安全--(五)物理与环境安全技术(二)机房安全分析与防护
  • 【Linux操作系统】重装系统配置文件一条龙
  • STM32通过ADM3222完成UART转232通信电平转换