Path: blob/devel/elmergrid/src/metis-5.1.0/GKlib/fkvkselect.c
3206 views
/*!1\file dfkvkselect.c2\brief Sorts only the largest k values34\date Started 7/14/005\author George6\version\verbatim $Id: fkvkselect.c 10711 2011-08-31 22:23:04Z karypis $\endverbatim7*/8910#include <GKlib.h>1112/* Byte-wise swap two items of size SIZE. */13#define QSSWAP(a, b, stmp) do { stmp = (a); (a) = (b); (b) = stmp; } while (0)141516/******************************************************************************/17/*! This function puts the 'topk' largest values in the beginning of the array */18/*******************************************************************************/19int gk_dfkvkselect(size_t n, int topk, gk_fkv_t *cand)20{21int i, j, lo, hi, mid;22gk_fkv_t stmp;23float pivot;2425if (n <= topk)26return n; /* return if the array has fewer elements than we want */2728for (lo=0, hi=n-1; lo < hi;) {29mid = lo + ((hi-lo) >> 1);3031/* select the median */32if (cand[lo].key < cand[mid].key)33mid = lo;34if (cand[hi].key > cand[mid].key)35mid = hi;36else37goto jump_over;38if (cand[lo].key < cand[mid].key)39mid = lo;4041jump_over:42QSSWAP(cand[mid], cand[hi], stmp);43pivot = cand[hi].key;4445/* the partitioning algorithm */46for (i=lo-1, j=lo; j<hi; j++) {47if (cand[j].key >= pivot) {48i++;49QSSWAP(cand[i], cand[j], stmp);50}51}52i++;53QSSWAP(cand[i], cand[hi], stmp);545556if (i > topk)57hi = i-1;58else if (i < topk)59lo = i+1;60else61break;62}6364/*65if (cand[lo].key < cand[hi].key)66printf("Hmm Error: %d %d %d %f %f\n", i, lo, hi, cand[lo].key, cand[hi].key);676869for (i=topk; i<n; i++) {70for (j=0; j<topk; j++)71if (cand[i].key > cand[j].key)72printf("Hmm Error: %d %d %f %f %d %d\n", i, j, cand[i].key, cand[j].key, lo, hi);73}74*/7576return topk;77}787980/******************************************************************************/81/*! This function puts the 'topk' smallest values in the beginning of the array */82/*******************************************************************************/83int gk_ifkvkselect(size_t n, int topk, gk_fkv_t *cand)84{85int i, j, lo, hi, mid;86gk_fkv_t stmp;87float pivot;8889if (n <= topk)90return n; /* return if the array has fewer elements than we want */9192for (lo=0, hi=n-1; lo < hi;) {93mid = lo + ((hi-lo) >> 1);9495/* select the median */96if (cand[lo].key > cand[mid].key)97mid = lo;98if (cand[hi].key < cand[mid].key)99mid = hi;100else101goto jump_over;102if (cand[lo].key > cand[mid].key)103mid = lo;104105jump_over:106QSSWAP(cand[mid], cand[hi], stmp);107pivot = cand[hi].key;108109/* the partitioning algorithm */110for (i=lo-1, j=lo; j<hi; j++) {111if (cand[j].key <= pivot) {112i++;113QSSWAP(cand[i], cand[j], stmp);114}115}116i++;117QSSWAP(cand[i], cand[hi], stmp);118119120if (i > topk)121hi = i-1;122else if (i < topk)123lo = i+1;124else125break;126}127128/*129if (cand[lo].key > cand[hi].key)130printf("Hmm Error: %d %d %d %f %f\n", i, lo, hi, cand[lo].key, cand[hi].key);131132133for (i=topk; i<n; i++) {134for (j=0; j<topk; j++)135if (cand[i].key < cand[j].key)136printf("Hmm Error: %d %d %f %f %d %d\n", i, j, cand[i].key, cand[j].key, lo, hi);137}138*/139140return topk;141}142143144