排序演算法 堆排序

2021-06-18 21:43:03 字數 2331 閱讀 1687

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的**即為堆排序的**。

主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於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 三 堆排序...

排序演算法 堆排序

都說堆排序是時間複雜度最小的排序演算法,講了各種堆排序的好,我這裡就不贅述了,今天花了乙個下午和半個晚上的時間算是差不多研究明白了堆排序。其實堆排序的邏輯並不是特別複雜,如果理解了就會覺得沒有那麼難,但是寫 的實現的時候,還是需要考慮很多事情的。反正我是被繞暈過的 首先,寫一下我對堆排序思想的認識。...