排序算法--堆排序

本文介绍了堆排序算法,包括其代码实现,并提供了辅助测试代码,旨在帮助读者理解和记忆堆排序这一经典排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

堆排序代码

主函数中是对输入文件中的序列进行排序,并将结果输出到一个文件中。这是一种形式类似于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代码的文件名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值