您的位置:首页 > 其它

排序算法--堆排序

2013-10-29 13:37 197 查看
由于不经常使用,之前学习看过的算法都给忘了。现在把他们写下来,记录下来,以方便以后查阅。本篇文章的代码即为堆排序的代码。

堆排序代码

主函数中是对输入文件中的序列进行排序,并将结果输出到一个文件中。这是一种形式类似于google codejam的测试方法。

#include <iostream>
#include <fstream>
using namespace std;

void aprint(int *arr,int length)
{
for(int i=0;i<length;i++)
{
cout<<arr[i]<<',';
}
cout<<endl;
}

int left_child(int parent)
{
return parent*2+1;
}

int right_child(int parent)
{
return parent*2+2;
}

void heap_adjust(int *arr,int cur,int length)
{

for(int i=cur;i<cur+length;)
{
int left=left_child(i);
int right=right_child(i);
int bigger_child=left;
if (left>=cur+length) return;
if(left<cur+length-1 && arr[left]<arr[right])
{
bigger_child=right;
}
if(arr[bigger_child]>arr[i])
{
int tmp=arr[i];
arr[i]=arr[bigger_child];
arr[bigger_child]=tmp;
}
i=bigger_child;
}
}

void heap_build(int *arr,int length)
{
for(int i=length-1;i>=0;i--)
{
heap_adjust(arr,i,length-i);
}
}

void heap_sort(int *arr,int length)
{
heap_build(arr,length);
for(int i=length-1;i>0;i--)
{
int tmp=arr[0];
arr[0]=arr[i];
arr[i]=tmp;
heap_adjust(arr,0,i);
}
}

int main()
{
int arr[16]={10,9,32,4,54,6,7,88,23,32,4,3,90,6,36,7};
ifstream fin("heap_sort.in",ios::in);
ofstream fou("heap_sort.out",ios::out);
int M=0;
fin>>M;
for(int i=0;i<M;i++)
{
int L=0;
fin>>L;
int *farr=new int[L];
for(int j=0;j<L;j++)
{
fin>>farr[j];
}
heap_sort(farr,L);
for(int j=0;j<L;j++)
{
fou<<farr[j];
if(j<L-1) fou<<" ";
else fou<<endl;
}
delete[] farr;
}
fin.close();
fou.close();
return 0;
}


辅助测试代码

下面的python代码是生成测试文件以及标准答案,并测试前面c++代码的输出结果。

import random
import sys

def generate_test_data(dataname):
fi=open(dataname+'.in','w')
fo=open(dataname+'.ans','w')
max_int=100000000
min_int=0
max_array_length=100
min_array_length=3
fi.write('%s\n'%(max_array_length-min_array_length))
for l in xrange(min_array_length,max_array_length):
fi.write('%s\n'%l)
arr=[random.randint(min_int,max_int) for j in xrange(l)]
sort_arr=sorted(arr)
fi.write(' '.join([str(s) for s in arr])+'\n')
fo.write(' '.join([str(s) for s in sort_arr])+'\n')
fi.close()
fo.close()

def verify_answer(dataname):
fo=open(dataname+'.out','r')
fa=open(dataname+'.ans','r')
case_no=1
la=fa.readline()
while la:
lo=fo.readline()
sla=la.split(' ')
slo=lo.split(' ')
if len(sla)!=len(slo):
print '%s Wrong Result:'%case_no,lo
return
wflag=False
for i in xrange(len(sla)):
if int(sla[i])!=int(slo[i]):
print '%s Wrong Result:'%case_no,lo
return
case_no=case_no+1
la=fa.readline()
lo=fo.readline()
if lo and not la:
print '%s More Result:'%case_no,lo
return
print 'Equal'

if __name__=='__main__':
if len(sys.argv)==1:
print 'Wrong usage'
if sys.argv[1]=='generate':
generate_test_data('heap_sort')
elif sys.argv[1]=='verify':
verify_answer('heap_sort')


这个python代码的使用方法为:python x.py generate即为生成测试输入文件以及标准答案,python x.py verify为验证前面c++程序生成的结果文件是否和标注答案一样。其中x.py即为上面python代码的文件名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: