首页 > 其他分享 >堆排序

堆排序

时间:2022-12-11 16:11:25浏览次数:35  
标签:typedef int HeapType 堆排序 elem HeapAdjust rc

比较常见的排序方法,见例题:

本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。

函数接口定义:

void HeapAdjust( HeapType  H, int s, int m);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;
typedef  struct {                      
  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       
  int Length;      
}SqList;
typedef SqList HeapType; 

裁判测试程序样例:

#include<stdio.h>
#include<stdlib.h>
typedef  int  KeyType;
typedef  struct {                      
  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       
  int Length;      
}SqList;
typedef SqList HeapType; 
void  CreatSqListHeapType *L);/*待排序列建立,由裁判实现,细节不表*/ 
void HeapAdjust( HeapType  H, int s, int m);
void HeapSort( HeapType  H);
int main()
{
  HeapType L;
  int i;
  CreatSqList(&L);
  HeapSort(L);
  for(i=1;i<=L.Length;i++)
   {        
     printf("%d ",L.elem[i]);
   }
  return 0;
}
void HeapSort( HeapType  H)
{ /*堆顺序表H进行堆排序*/
  int i; KeyType rc;
  /*建立初始堆*/
  for( i=H.Length/2;i>0; i--)
   {
      HeapAdjust(H, i, H.Length);
   }
  for(i=H.Length;i>1;i--)
   {
      rc=H.elem[1];
      H.elem[1]=H.elem[i]; 
      H.elem[i]=rc;
      HeapAdjust(H, 1, i-1); 
   }
 }
/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 
代码如下:
void HeapAdjust( HeapType  H, int s, int m){
	//假设r[s+1..m]已经是堆,将r[s..m]调整为以r[s]为根的大根堆
	KeyType rc;
	int j;
	rc=H.elem[s];
    for(j=2*s;j<=m;j*=2)
	{												//沿key较大的孩子结点向下筛选
		if(j<m&&H.elem[j]<H.elem[j+1]) ++j;		//j为key较大的记录的下标
        if(rc>=H.elem[j]) break;      			//rc应插入在位置s上
		H.elem[s]=H.elem[j]; s=j; 
    }
	H.elem[s]=rc;                          			//插入
} 

标签:typedef,int,HeapType,堆排序,elem,HeapAdjust,rc
From: https://www.cnblogs.com/yitongtianxia666/p/16973814.html

相关文章

  • 堆排序
    输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。#include<iostream>usingnamespacestd;constintN=1e5+10;intn,m,len;inth[N];voiddown......
  • 与堆和堆排序相关的问题
    与堆和堆排序相关的问题作者:Grey原文地址:博客园:与堆和堆排序相关的问题CSDN:与堆和堆排序相关的问题堆结构说明堆结构就是用数组实现的完全二叉树结构,什么是完全二叉......
  • 堆排序算法
    堆排序算法堆排序定义:堆排序是将一组无序数组(二叉树)构建成一个堆,分为大顶堆和小顶堆大顶堆:父节点的值永远大于其左子树和右子树的值堆排序思路:将堆顶元素与末尾元......
  • 堆排序+TOPK问题
    (文章目录)一.堆排序1.使用向上还是向下调整建堆好?(1)向上调整算法建堆的时间复杂度voidadjustup(HPDatatype*a,intchild)//向上调整算法{ intparent=(child-......
  • [排序算法] 堆排序 (C++)
    堆排序解释什么是堆堆heap是一种近似完全二叉树的数据结构,其满足一下两个性质1.堆中某个结点的值总是不大于(或不小于)其父结点的值;2.堆总是一棵完全二叉树将根......
  • 堆排序用法
    因为堆结构只保证根节点比双子节点都大或小1  求最小的n个数:   构建n个数的大顶堆,依次弹出堆顶再往下调整(用例省略)2  求最大的n个数:   构建n个数的......
  • 堆排序优化版Dijkstra
    Dijkstra依旧基于贪心用堆排序动态维护剩余点中dist[]最小的点堆排序优化Dijkstra算法 稀疏图,用邻接表,稠密也可以 void add(int a,int b,int c){    e[i......
  • 堆排序的基本知识
    堆的性质分为大根堆和小根堆,性质为结点的左右孩子大于或小于根节点(1)堆是一颗完全二叉树;(2)小(大)顶堆中的每一个节点都不小于(不大于)它的父节点;(3)堆的插入、删除......
  • js-基础排序实现(冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序)
    冒泡排序:两个指针循环,遇到不合适就交换,直到将符合要求的浮到边界functionbubbleSort(list){ for(leti=0;i<list.length;i++){ for(letj=0;j<list.length-i-1;j++)......
  • 快速排序-归并排序-堆排序
    十大排序动图快速排序优化数组取标pivot,将小的元素放在pivot左边,大元素在右侧,然后依次对右边的子数组继续快排,以达到整个序列有序publicclassQuickSort{public......