ヒープソート
何回も申し訳ございません。ヒープソートを使用して、K番目に小さい配列の要素を見つけるプログラムを作成していますが、セグメンテーションフォルトが出力され、途方に暮れています。どなたか助けていただけないでしょうか?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void heap(int c,int size,int *s){
int child,p;
int tmp;
child=s[c];
while(1){
p=(c-1)/2;//calculate an index of their parent
if(c<0) break;
if(c!=0){
if (s[c]>s[c-1]) {
c=c-1;
}
}
if (s[p]<=s[c]) break; // break if a parent is smaller than a child
tmp=s[p];
s[p]=s[c];
s[c]=tmp;
c=p;//declare a parent node as a child node
}
}
void heap_sort(int c,int size,int *s){
int tmp,i,j;
//make the first heap
for(i=size-1;i>=0;i--){
heap(i,size,s);
}
//exchange root s and the last s, and sort them
for(i=size-1;i>=0;i--){
tmp=s[0];
s[0]=s[i];
s[i]=tmp;
for(j=i;j>=0;j--){
heap(j-1,j,s);
}
}
}
main()
{
int num,i,k;
int high;
int low=0;
int s[20];
struct timeval t1,t2;
printf("How many elements?:");
scanf("%d",&high);
printf("?n");
printf("What number?:");
scanf("%d",&k);
printf("?n");
srand((unsigned)time(NULL));
for(i=0;i<high;i++){
s[i]=rand()%10;
printf("%d ",s[i]);
}
printf("?n");
gettimeofday(&t1,0);
heap_sort(high-1, high,s);
gettimeofday(&t2,0);
printf("Time=%dmicrosec?n", t2.tv_usec-t1.tv_usec);
printf("The %dth smallest is %d?n ", k,s[k]);
}
お礼
根に最大値を持っていって、それを昇順にソートする方法がいまいちわからなく… ヒープソートした配列とは別に空の配列を持って ヒープソートした根にある最大値を空の配列の後尾のほうに持っていくのかと思ってまして…