选择类排序-堆排序
2014-04-16 21:23
351 查看
#include<stdio.h> #define N 20 int main() { void heapSort(int *,int); int i,a[N+1]; printf("Enter twenty numbers:\n"); for(i=1;i<=N;i++)/*由于堆排序用得是完全二叉树,所以元素的存储必须从1开始*/ scanf("%d",a+i); heapSort(a,N); for(i=1;i<=N;i++) printf("%d ",a[i]); return 0; } /*本函数完成对在数组a[low]到a[high]范围内对在位置low上的节点进行调整*/ void Sift(int *a,int low,int high) { int i=low,j=i*2;/*a[j]是a[i]的左孩子结点*/ int temp=a[i];/*保存位置low上的结点*/ while(j<=high) { if(j<high&&a[j]<a[j+1])/*若存在右孩子,且右孩子值较大,则把j指向右孩子*/ ++j;/*此时j的值是(2*i+1) */ if(temp<a[j])/*父节点的值比子节点值小,需要进行交换*/ { a[i]=a[j];/*交换父节点和子节点的值*/ i=j;/*记录调整后原来low节点的位置,以便继续向下调整*/ j=i*2;/*和子节点交换后的low节点的子节点*/ } else break;/*调整结束*/ } a[i]=temp;/*将被调整的low节点的值放入最终位置*/ } /*堆排序函数*/ void heapSort(int *a,int n) { int i,temp; for(i=n/2;i>=1;--i)/*建立初始堆*/ Sift(a,i,n); for(i=n;i>=2;--i)/*进行n-1次循环完成堆排序*/ { temp=a[1];/*以下3句换出了根节点中的元素,将其放入最终位置*/ a[1]=a[i]; a[i]=temp; Sift(a,1,i-1);/*由于这次只需要调整根节点,而且元素个数减少了1个*/ } }
相关文章推荐
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 排序算法七:选择排序之堆排序
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- 名称:选择排序---简单选择排序和堆排序
- 选择排序----直接选择排序与堆排序
- 第十六周项目1-(6)验证算法选择排序之堆排序
- 排序算法2--简单选择排序、堆排序
- 选择排序之堆排序
- 常用的排序算法:冒泡,简单选择,直接插入,快速排序,堆排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- 2 -- 选择排序之堆排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 第十五周项目1 验证算法(5)选择排序之堆排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 【算法拾遗(java描述)】--- 选择排序(直接选择排序、堆排序)
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序
- 8.2 内部排序法---选择类排序(简单选择、堆排序)
- 直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)