]> git.gag.com Git - debian/gnuradio/blob - gr-trellis/src/lib/quicksort_index.cc
added comments in quicksort_index.cc
[debian/gnuradio] / gr-trellis / src / lib / quicksort_index.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2004 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "quicksort_index.h"
24
25 template <class T> void SWAP (T & a, T & b)
26 {
27 T temp=a;
28 a=b;
29 b=temp;
30 }
31
32
33 // standard quicksorting but also return the indices of the sorted data
34 // don't know how to make it work with swig...
35 template <class T> void quicksort_index(std::vector<T> & p, std::vector<int> & index, int left, int right)
36 {
37
38 if (left < right) {
39     int i = left;
40     int j = right + 1;
41     T pivot = p[left];
42     do {
43         do 
44             i++;
45         while ((p[i] < pivot) && (i < right));
46         do 
47             j--;
48         while ((p[j] > pivot) && (j > left));
49         if (i < j) {
50             SWAP <T> (p[i],p[j]);
51             SWAP <int> (index[i],index[j]);
52         }
53     } while (i < j);
54     SWAP <T> (p[left], p[j]);
55     SWAP <int> (index[left], index[j]);
56     quicksort_index <T> (p,index, left, j-1);
57     quicksort_index <T> (p,index, j+1, right);
58 }
59 }
60
61
62
63 // Same as above (only works for int data)
64 void quicksort_index1(std::vector<int> & p, std::vector<int> & index, int left, int right)
65 {
66
67 if (left < right) {
68     int i = left;
69     int j = right + 1;
70     int pivot = p[left];
71     do {
72         do
73             i++;
74         while ((p[i] < pivot) && (i < right));
75         do
76             j--;
77         while ((p[j] > pivot) && (j > left));
78         if (i < j) {
79             SWAP <int> (p[i],p[j]);
80             SWAP <int> (index[i],index[j]);
81         }
82     } while (i < j);
83     SWAP <int> (p[left], p[j]);
84     SWAP <int> (index[left], index[j]);
85     quicksort_index1 (p,index, left, j-1);
86     quicksort_index1 (p,index, j+1, right);
87 }
88 }
89