排序算法--堆排序
2013-10-29 13:37
197 查看
由于不经常使用,之前学习看过的算法都给忘了。现在把他们写下来,记录下来,以方便以后查阅。本篇文章的代码即为堆排序的代码。
这个python代码的使用方法为:python x.py generate即为生成测试输入文件以及标准答案,python x.py verify为验证前面c++程序生成的结果文件是否和标注答案一样。其中x.py即为上面python代码的文件名称。
堆排序代码
主函数中是对输入文件中的序列进行排序,并将结果输出到一个文件中。这是一种形式类似于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代码的文件名称。
相关文章推荐
- 排序算法——堆排序
- 排序算法-之选择排序(直接选择排序,堆排序)
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 排序算法-------堆排序(大根堆)
- 排序算法(堆排序)
- 【排序算法】之堆排序
- 【算法之常用排序算法(一)】八大常用内部排序算法(快排、冒泡、希尔、堆排序等)
- 排序算法(堆排序,归并排序,快速排序、选择排序、直接插入排序)
- 排序算法之堆排序
- 排序算法(2)-堆排序
- 浅析各类排序算法(七) 选择类排序之堆排序
- Java排序算法:堆排序
- 排序算法总结---树形选择排序,堆排序
- PHP实现排序算法----堆排序(Heap Sort)
- 排序算法之堆排序
- golang实现常用排序算法 --- 快速排序、堆排序等
- 排序算法(四)、选择排序 —— 简单选择排序 和 堆排序
- 排序算法之 堆排序
- 排序算法总结-插入排序、希尔排序、堆排序、快速排序
- 排序算法-堆排序