c语言 s数据结构 入元素序列,采用堆排序对序列进行排序,并将堆依据树状结构在屏幕上输出层次遍历的结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 s数据结构 入元素序列,采用堆排序对序列进行排序,并将堆依据树状结构在屏幕上输出层次遍历的结果相关的知识,希望对你有一定的参考价值。
程序无错误 但一运行就会出现cannot open file "Debug/duipaixu.exe" 。为什么呢
#include<stdio.h>#include<stdlib.h>
typedef int Status;
#define OK 1
int num;
Status Sift(int*p,int i,int m)
int j;
p[0]=p[i];
for(j=2*i;j<=m;j*=2)
if(j<m&&p[j]<p[j+1])
j++;
if(p[0]<p[j])
p[i]=p[j];
i=j;
else
break;
p[i]=p[0];
return OK;
Status HeapSort(int *p,int n)
int i,j;
for(i=n/2;i>0;i--)
Sift(p,i,n);
for(i=1;i<=num;i++)
printf("%d ",p[i]);
printf("\n");
for(i=n;i>1;i--)
p[0]=p[i];
p[i]=p[1];
p[1]=p[0];
Sift(p,1,i-1);
for(j=1;j<=num;j++)
printf("%d ",p[j]);
printf("\n");
return 0;
int main()
int i,*p;
scanf("%d",&num);
p=(int *)malloc((num+1)*sizeof(int));
for(i=1;i<=num;i++)
scanf("%d",&p[i]);
HeapSort(p,num);
return 0;
追问
程序无错误 但一运行就会出现cannot open file "Debug/duipaixu.exe" 。为什么呢
参考技术A 新号,任务大话数据结构C语言68 堆排序
堆排序算法是利用堆进行排序的方法
基本思想是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。
将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值,如此反复执行,最后就可以得到一个有序序列了
堆排序的时间复杂度为nlogn,这个性能要远远好于冒泡,简单选择,直接插入排序的时间复杂度
空间复杂度上,它只有一个用来交换的暂存单元,也是非常的不错
但是由于记录的比较与交换是跳跃式进行,因此堆排序也是一种不稳定的排序方法
另外,由于初始构建堆需要比较次数很多,所以不适合待排序个数比较少的情况
#include <stdio.h>
int count = 0;
void swap(int k[], int i, int j)
{
int temp;
temp = k[i];
k[i] = k[j];
k[j] = temp;
}
void HeapAdjust(int k[], int s, int n)
{
int i, temp;
temp = k[s];
for( i=2*s; i <= n; i*=2 )
{
count++;
if( i < n && k[i] < k[i+1] )
{
i++;
}
if( temp >= k[i] )
{
break;
}
k[s] = k[i];
s = i;
}
k[s] = temp;
}
void HeapSort(int k[], int n)
{
int i;
for( i=n/2; i > 0; i-- )
{
HeapAdjust(k, i, n);
}
for( i=n; i > 1; i-- )
{
swap(k, 1, i);
HeapAdjust(k, 1, i-1);
}
}
int main()
{
int i, a[10] = {-1, 5, 2, 6, 0, 3, 9, 1, 7, 4};
HeapSort(a, 9);
printf("总共执行 %d 次比较!", count);
printf("排序后的结果是:");
for( i=1; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\\n\\n");
return 0;
}
以上是关于c语言 s数据结构 入元素序列,采用堆排序对序列进行排序,并将堆依据树状结构在屏幕上输出层次遍历的结果的主要内容,如果未能解决你的问题,请参考以下文章
数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用( )算法最节省时间.为啥?
C语言关键码序列 66 13 51 76 81 26 57 69 23 谁能给我解释一下答案,见详细,尤其是66怎么跑的