算法-排序(1)k路平衡归并与败者树

const int MaxValue=999;   //根据实际情况选择最大值
void kwaymerge(Element *r,int k){
    int i,q;
    r=new Element[k];   //在败者树中的k个记录
    int *key=new int[k+1];  //k个排序码和建树单元key[k]
    int *loser=new int[k];  //k-1个败者和冠军loser[0]
    for(i=0; i<k; i++){      //从k个归并段输入第一个记录及其排序码
        InputRecord(r[i]);
        key[i]=r[i].key;
    }
    for(i=0; i<k; i++) loser[i]=k;   //败者树所有结点都赋值k,表示第k归并段
    key[k]=-MaxValue;
    for (i=k-1; i>=0; i--) adjust(key,loser,k,i);   //从key[k-1]起~key[0]起调整形成败者树
    while(key[loser[0]]!=MaxValue){     //当MaxValue上升到loser[0]归并完毕
        q=loser[0];    //取当前最小关键码所在归并段段号送q
        OutputRecord(r[q]);   //r[q]写到输出归并段
        InputRecord(r[q]);    //从第q个归并段再读入下一条记录
        key[q]=r[q].key;
        adjust(key,loser,k,q);  //从key[q]起调整为败者树
    }
    Output end of run marker;   //输出段结束标志
    delete []r;
    delete []k;
    delete []loser;
}

void adjust(int key[]; int loser[]; int k; int q){
    for(int t=(k+q)/2; t>0; t/=2)
        if(key[loser[t]]<key[q]){
            int temp=q;
            q=loser[t];
            loser[t]=temp;
        }
    loser[0]=q;
}

原文地址:https://www.cnblogs.com/yangyuliufeng/p/9251665.html

时间: 2024-10-11 06:25:20

算法-排序(1)k路平衡归并与败者树的相关文章

外排序 &nbsp; 败者树 &nbsp; 多路归并

一.外排序 排序按数据存在的位置不同分为内排序和外排序 内排序:数据都在内存中,选择合适的排序方法对数据进行排序,比如选择排序.快速排序等 衡量内排序的效率是数据的比较次数 外排序:数据无法全部加载到内存中,只能不断在外部存储器和内存中进行交换完成排序 衡量外排序的效率是内存与外村的交换次数 外排序是针对大文件的数据排序,内存中无法加载这个大文件,把这个文件分为k个小文件,分别排序后合并 http://blog.csdn.net/msdnwolaile/article/details/52084

外排序 &amp; 败者树 &amp; 多路归并-学习

来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树.只需要沿着从该结点到根结点的路径修改这棵二叉树,而不必改变其他比赛的结果. 二.败者树 败者树是胜者树的一种变体.在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛.败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者.采用败者树可以

排序(二)键索引、桶排序、位示图、败者树等

排序(二) 以上排序算法都有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较.我们把这类排序算法称为比较排序. 任何比较排序的时间复杂度的下界是nlgn. 以下排序算法是用运算而不是比较来确定排序顺序的.因此下界nlgn对它们是不适用的. 键索引计数法(计数排序) 计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为某个整数. 思想:对每一个输入元素x,确定小于x的元素个数.利用这一信息,就可以直接把x放到它在输出数组中的位置了. 例如: 学生被分为若干组,标号为

算法导论 6.5.9 堆实现K路归并问题

问题: 设计一个时间复杂度为O(NlogK)的算法,它能够将K个有序链表合并为一个有序链表,这里的N为所有输入链表包含的总的元素个数 分析: 该问题为经典的利用堆完成K路归并的问题: 当K个序列满足一定的条件(如单调不减或单调不增)时,利用堆实现K路归并使其归并为一个满足相同条件的 序列,具体做法如下: 1)假设存在K个序列,从每一个序列中取出一个元素放于堆中; 2)从堆中取出顶端元素,并在该元素的序列中取出下一个元素插入堆中. 3)重复操作1)与2),直到完成归并. 具体问题: poj_205

Merge k Sorted Lists, k路归并

import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /* class ListNode { ListNode next; int val; ListNode(int x) { val = x; } } */ //k路归并问题 public class MergKSortedLists { //二路归并,这个算法时间复杂度o(2n) public ListNode mergeTwoLists

编程算法 - K路归并排序(k-way merge sort) 代码(C++)

K路归并排序(k-way merge sort) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy K路归并排序作为经典的外部排序算法, 是程序员必须要掌握的. 知识概念参考: <数据结构> 主要思想: 在k个已排序的文件中, 选择第一个值, 采用败者树, 更新二叉树结构, 最终选择最优值. 代码仅供参考, 如最小值用(-1)代替, 最大值用(100)代替. /* * main.cpp * * Created on: 2014年9月11日 *

算法大神之路----排序(插入排序法)

插入排序法 所谓插入排序法乃是将一个数目插入该占据的位置. 输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕. 代码示例: import java.util.Random; /** * 算法大神之路----排序(插入排序法) */ public class Study03 { public static void main(String[] args) { //新建一个数组 int[] arr = n

算法导论第二章C++实现归并算法排序

归并算法排序的思想算法导论中讲的还算比较清楚. #include<iostream> using namespace std; void guibing(int *_array,int p,int q,int r); void merge_sort(int *_array,int p,int r); int main() { int a[8]={2,4,5,7,1,2,3,6}; int j1=0; int j2=7; merge_sort(a,j1,j2); int i=0; for(;i&

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两