annotate Problems/private/omputils.c @ 55:435da1dc71a0

(none)
author idamnjanovic
date Mon, 14 Mar 2011 16:55:49 +0000
parents 217a33ac374e
children
rev   line source
idamnjanovic@51 1 /**************************************************************************
idamnjanovic@51 2 *
idamnjanovic@51 3 * File name: omputils.c
idamnjanovic@51 4 *
idamnjanovic@51 5 * Ron Rubinstein
idamnjanovic@51 6 * Computer Science Department
idamnjanovic@51 7 * Technion, Haifa 32000 Israel
idamnjanovic@51 8 * ronrubin@cs
idamnjanovic@51 9 *
idamnjanovic@51 10 * Last Updated: 18.8.2009
idamnjanovic@51 11 *
idamnjanovic@51 12 *************************************************************************/
idamnjanovic@51 13
idamnjanovic@51 14 #include "omputils.h"
idamnjanovic@51 15 #include <math.h>
idamnjanovic@51 16
idamnjanovic@51 17
idamnjanovic@51 18 const char FULL_GAMMA_STR[] = "full";
idamnjanovic@51 19 const char SPARSE_GAMMA_STR[] = "sparse";
idamnjanovic@51 20
idamnjanovic@51 21
idamnjanovic@51 22 /* convert seconds to hours, minutes and seconds */
idamnjanovic@51 23
idamnjanovic@51 24 void secs2hms(double sectot, int *hrs, int *mins, double *secs)
idamnjanovic@51 25 {
idamnjanovic@51 26 *hrs = (int)(floor(sectot/3600)+1e-2);
idamnjanovic@51 27 sectot = sectot - 3600*(*hrs);
idamnjanovic@51 28 *mins = (int)(floor(sectot/60)+1e-2);
idamnjanovic@51 29 *secs = sectot - 60*(*mins);
idamnjanovic@51 30 }
idamnjanovic@51 31
idamnjanovic@51 32
idamnjanovic@51 33 /* quicksort, public-domain C implementation by Darel Rex Finley. */
idamnjanovic@51 34 /* modification: sorts the array data[] as well, according to the values in the array vals[] */
idamnjanovic@51 35
idamnjanovic@51 36 #define MAX_LEVELS 300
idamnjanovic@51 37
idamnjanovic@51 38 void quicksort(mwIndex vals[], double data[], mwIndex n) {
idamnjanovic@51 39
idamnjanovic@51 40 long piv, beg[MAX_LEVELS], end[MAX_LEVELS], i=0, L, R, swap ;
idamnjanovic@51 41 double datapiv;
idamnjanovic@51 42
idamnjanovic@51 43 beg[0]=0;
idamnjanovic@51 44 end[0]=n;
idamnjanovic@51 45
idamnjanovic@51 46 while (i>=0) {
idamnjanovic@51 47
idamnjanovic@51 48 L=beg[i];
idamnjanovic@51 49 R=end[i]-1;
idamnjanovic@51 50
idamnjanovic@51 51 if (L<R) {
idamnjanovic@51 52
idamnjanovic@51 53 piv=vals[L];
idamnjanovic@51 54 datapiv=data[L];
idamnjanovic@51 55
idamnjanovic@51 56 while (L<R)
idamnjanovic@51 57 {
idamnjanovic@51 58 while (vals[R]>=piv && L<R)
idamnjanovic@51 59 R--;
idamnjanovic@51 60 if (L<R) {
idamnjanovic@51 61 vals[L]=vals[R];
idamnjanovic@51 62 data[L++]=data[R];
idamnjanovic@51 63 }
idamnjanovic@51 64
idamnjanovic@51 65 while (vals[L]<=piv && L<R)
idamnjanovic@51 66 L++;
idamnjanovic@51 67 if (L<R) {
idamnjanovic@51 68 vals[R]=vals[L];
idamnjanovic@51 69 data[R--]=data[L];
idamnjanovic@51 70 }
idamnjanovic@51 71 }
idamnjanovic@51 72
idamnjanovic@51 73 vals[L]=piv;
idamnjanovic@51 74 data[L]=datapiv;
idamnjanovic@51 75
idamnjanovic@51 76 beg[i+1]=L+1;
idamnjanovic@51 77 end[i+1]=end[i];
idamnjanovic@51 78 end[i++]=L;
idamnjanovic@51 79
idamnjanovic@51 80 if (end[i]-beg[i] > end[i-1]-beg[i-1]) {
idamnjanovic@51 81 swap=beg[i]; beg[i]=beg[i-1]; beg[i-1]=swap;
idamnjanovic@51 82 swap=end[i]; end[i]=end[i-1]; end[i-1]=swap;
idamnjanovic@51 83 }
idamnjanovic@51 84 }
idamnjanovic@51 85 else {
idamnjanovic@51 86 i--;
idamnjanovic@51 87 }
idamnjanovic@51 88 }
idamnjanovic@51 89 }