• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言对堆排序一个算法思路和实现代码

C语言对堆排序一个算法思路和实现代码

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言堆排序,堆排序c语言实现,堆排序算法c语言,堆排序c语言代码,堆排序c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

算法思想简单描述:

堆排序是一种树形选择排序,是对直接选择排序的有效改进。

堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。

由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。

初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。

从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

堆排序是不稳定的。算法时间复杂度O(nlog2n)。

void sift(int *x, int n, int s){
  int t, k, j;
  t = *(x+s);
  k = s;
  j = 2*k + 1;
  
  while (j{
    if (j< *(x+j+1)) && *(x+j) /> {  //判断是否满足堆的条件:满足就继续下一轮比较,否则调整。
      j++;
    }
    if (t<*(x+j)){
      *(x+k) = *(x+j);
      k = j;
      j = 2*k + 1;
    }else{
      break;
    }
  }
  *(x+k) = t;
}

void heap_sort(int *x, int n){
  int i, k, t;
  int *p;
  for (i=n/2-1; i>=0; i--){
    sift(x,n,i);
  }
  for (k=n-1; k>=1; k--){
    t = *(x+0);
    *(x+0) = *(x+k);
    *(x+k) = t;
    sift(x,k,0);
  }
}

void main(){
  #define MAX 4
  int *p, i, a[MAX];

  p = a;
  printf("Input %d number for sorting :\n",MAX);
  for (i=0; i<MAX; i++){
    scanf("%d",p++);
  }
  printf("\n");
 
  p = a;
  select_sort(p,MAX);
  for (p=a, i=0; i++){
    printf("%d ",*p++);
  }
  printf("\n");
  system("pause");
}
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言 数据结构堆排序顺序存储(升序)
  • C语言实现堆排序的简单实例
  • C语言对堆排序一个算法思路和实现代码

相关文章

  • 2017-05-28C语言中函数声明与调用问题
  • 2017-08-30c语言实现字符串中单词的反转
  • 2017-05-28一波二叉树遍历问题的C++解答实例分享
  • 2017-05-28基于排列与组合输出多少中情况详解
  • 2017-05-28用C语言实现单链表的各种操作(一)
  • 2017-05-28Species Tree 利用HashTable实现实例代码
  • 2017-05-28详解在C++中显式默认设置的函数和已删除的函数的方法
  • 2017-05-28实例讲解C++编程中对设计模式中的原型模式的使用
  • 2017-05-28计时器的time_t和clock_t 的两种实现方法(推荐)
  • 2017-05-28C++ 创建桌面快捷方式 开始菜单的实现代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++虚函数的实现机制分析
    • 数据结构之AVL树详解
    • typedef_struct与struct之间的区别
    • 通过c++11改进我们的模式之改进命令模式
    • 在C++中自定义宏的简单方法
    • c语言中 基于随机函数的使用详解
    • C++通过msxml调用webservice示例分享
    • C++进程间共享数据实例
    • C++中指向结构体变量的指针
    • C++堆排序算法的实现方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有