Imported Upstream version 3.0
[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 template <class T> void quicksort_index(std::vector<T> & p, std::vector<int> & index, int left, int right)
34 {
35
36 if (left < right) {
37     int i = left;
38     int j = right + 1;
39     T pivot = p[left];
40     do {
41         do 
42             i++;
43         while ((p[i] < pivot) && (i < right));
44         do 
45             j--;
46         while ((p[j] > pivot) && (j > left));
47         if (i < j) {
48             SWAP <T> (p[i],p[j]);
49             SWAP <int> (index[i],index[j]);
50         }
51     } while (i < j);
52     SWAP <T> (p[left], p[j]);
53     SWAP <int> (index[left], index[j]);
54     quicksort_index <T> (p,index, left, j-1);
55     quicksort_index <T> (p,index, j+1, right);
56 }
57 }
58
59
60
61 void quicksort_index1(std::vector<int> & p, std::vector<int> & index, int left, int right)
62 {
63
64 if (left < right) {
65     int i = left;
66     int j = right + 1;
67     int pivot = p[left];
68     do {
69         do
70             i++;
71         while ((p[i] < pivot) && (i < right));
72         do
73             j--;
74         while ((p[j] > pivot) && (j > left));
75         if (i < j) {
76             SWAP <int> (p[i],p[j]);
77             SWAP <int> (index[i],index[j]);
78         }
79     } while (i < j);
80     SWAP <int> (p[left], p[j]);
81     SWAP <int> (index[left], index[j]);
82     quicksort_index1 (p,index, left, j-1);
83     quicksort_index1 (p,index, j+1, right);
84 }
85 }
86