由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的**即為堆排序的**。
主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。
#include #include using namespace std;
void aprint(int *arr,int length)
i=bigger_child;
}}void heap_build(int *arr,int length)
}void heap_sort(int *arr,int length)
}int main()
; ifstream fin("heap_sort.in",ios::in);
ofstream fou("heap_sort.out",ios::out);
int m=0;
fin>>m;
for(int i=0;i>l;
int *farr=new int[l];
for(int j=0;j>farr[j];
}heap_sort(farr,l);
for(int j=0;j
下面的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**的檔名稱。
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...
排序演算法 堆排序
都說堆排序是時間複雜度最小的排序演算法,講了各種堆排序的好,我這裡就不贅述了,今天花了乙個下午和半個晚上的時間算是差不多研究明白了堆排序。其實堆排序的邏輯並不是特別複雜,如果理解了就會覺得沒有那麼難,但是寫 的實現的時候,還是需要考慮很多事情的。反正我是被繞暈過的 首先,寫一下我對堆排序思想的認識。...