Imported Upstream version 3.2.2
[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 3, 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>
26 void
27 SWAP
28 (T & a, T & b)
29 {
30   T temp = a;
31   a = b;
32   b = temp;
33 }
34
35 template <class T>
36 void
37 quicksort_index
38 (std::vector<T> & p, std::vector<int> & index, int left, int right)
39 {
40   if (left < right) {
41     int i = left;
42     int j = right + 1;
43     T pivot = p[left];
44     do {
45       do
46         i++;
47       while ((p[i] < pivot) && (i < right));
48       do
49         j--;
50       while ((p[j] > pivot) && (j > left));
51       if (i < j) {
52         SWAP <T> (p[i],p[j]);
53         SWAP <int> (index[i],index[j]);
54       }
55     } while (i < j);
56     SWAP <T> (p[left], p[j]);
57     SWAP <int> (index[left], index[j]);
58     quicksort_index <T> (p,index, left, j-1);
59     quicksort_index <T> (p,index, j+1, right);
60   }
61 }
62
63 // instantiate an <int> version of the quicksort_index
64 //template <int> void SWAP (int & a, int & b);
65 template
66 void
67 quicksort_index<int>
68 (std::vector<int> & p, std::vector<int> & index, int left, int right);