HPCToolkit
QuickSort.cpp
Go to the documentation of this file.
1 // -*-Mode: C++;-*-
2 
3 // * BeginRiceCopyright *****************************************************
4 //
5 // $HeadURL$
6 // $Id$
7 //
8 // --------------------------------------------------------------------------
9 // Part of HPCToolkit (hpctoolkit.org)
10 //
11 // Information about sources of support for research and development of
12 // HPCToolkit is at 'hpctoolkit.org' and in 'README.Acknowledgments'.
13 // --------------------------------------------------------------------------
14 //
15 // Copyright ((c)) 2002-2019, Rice University
16 // All rights reserved.
17 //
18 // Redistribution and use in source and binary forms, with or without
19 // modification, are permitted provided that the following conditions are
20 // met:
21 //
22 // * Redistributions of source code must retain the above copyright
23 // notice, this list of conditions and the following disclaimer.
24 //
25 // * Redistributions in binary form must reproduce the above copyright
26 // notice, this list of conditions and the following disclaimer in the
27 // documentation and/or other materials provided with the distribution.
28 //
29 // * Neither the name of Rice University (RICE) nor the names of its
30 // contributors may be used to endorse or promote products derived from
31 // this software without specific prior written permission.
32 //
33 // This software is provided by RICE and contributors "as is" and any
34 // express or implied warranties, including, but not limited to, the
35 // implied warranties of merchantability and fitness for a particular
36 // purpose are disclaimed. In no event shall RICE or contributors be
37 // liable for any direct, indirect, incidental, special, exemplary, or
38 // consequential damages (including, but not limited to, procurement of
39 // substitute goods or services; loss of use, data, or profits; or
40 // business interruption) however caused and on any theory of liability,
41 // whether in contract, strict liability, or tort (including negligence
42 // or otherwise) arising in any way out of the use of this software, even
43 // if advised of the possibility of such damage.
44 //
45 // ******************************************************* EndRiceCopyright *
46 
47 //************************** System Include Files ***************************
48 
49 #ifdef NO_STD_CHEADERS
50 # include <stdlib.h>
51 #else
52 # include <cstdlib> // for 'rand'
53 using namespace std; // For compatibility with non-std C headers
54 #endif
55 
56 //*************************** User Include Files ****************************
57 
58 #include <include/uint.h>
59 
60 #include "QuickSort.hpp"
61 
62 //*************************** Forward Declarations **************************
63 
64 //***************************************************************************
65 
67 {
68  return;
69 }
70 
72 {
73  return;
74 }
75 
76 void QuickSort::Create (void** UserArrayPtr, const EntryCompareFunctPtr _CompareFunct)
77 {
78  ArrayPtr = UserArrayPtr;
79  CompareFunct = _CompareFunct;
80 
81  QuickSortCreated = true;
82 
83  return;
84 }
85 
87 {
88  QuickSortCreated = false;
89 
90  return;
91 }
92 
93 void QuickSort::Swap (int a, int b)
94 {
95  if (QuickSortCreated)
96  {
97  void* hold;
98  hold = ArrayPtr[a];
99  ArrayPtr[a] = ArrayPtr[b];
100  ArrayPtr[b] = hold;
101  }
102 
103  return;
104 }
105 
106 int QuickSort::Partition (const int min, const int max, const int q)
107 {
108  if (QuickSortCreated)
109  {
110  Swap (min, q);
111  void* x = ArrayPtr[min];
112  int j = min - 1;
113  int k = max + 1;
114  bool ExitFlag = false;
115  while (!ExitFlag)
116  {
117  do
118  k--;
119  while ((CompareFunct (ArrayPtr[k], x) > 0) && (k>min));
120  do
121  j++;
122  while ((CompareFunct (ArrayPtr[j], x) < 0) && (j<max));
123  if (j < k)
124  Swap (j, k);
125  else
126  ExitFlag = true;
127  }
128  return k;
129  }
130  else return 0;
131 }
132 
133 void QuickSort::Sort (const int minEntryIndex, const int maxEntryIndex)
134 {
135  if (QuickSortCreated)
136  {
137  if (minEntryIndex < maxEntryIndex)
138  {
139  int index = rand () % (maxEntryIndex-minEntryIndex+1) + minEntryIndex;
140  int mid = Partition (minEntryIndex, maxEntryIndex, index);
141  Sort (minEntryIndex, mid);
142  Sort (mid+1, maxEntryIndex);
143  }
144  }
145 
146  return;
147 }
148 
int(* EntryCompareFunctPtr)(const void *, const void *)
Definition: HashTable.hpp:300
void Sort(const int minEntryIndex, const int maxEntryIndex)
Definition: QuickSort.cpp:133
virtual ~QuickSort()
Definition: QuickSort.cpp:71
void Destroy()
Definition: QuickSort.cpp:86
int Partition(const int min, const int max, const int q)
Definition: QuickSort.cpp:106
void Swap(int a, int b)
Definition: QuickSort.cpp:93
void Create(void **UserArrayPtr, const EntryCompareFunctPtr _CompareFunct)
Definition: QuickSort.cpp:76