#include "Const.hpp"
#include "MaxHeap.hpp"
Go to the source code of this file.
Compounds | |
struct | QEntry |
Defines | |
#define | __J2K__Sort_HPP__ |
#define | BITS 6 |
Functions | |
void | InsertionSort (Elem *array, int n) |
void | BubbleSort (Elem *array, int n) |
void | SelectionSort (Elem *array, int n) |
void | ShellSort (Elem *array, int n) |
void | InsertionSort (Elem *array, int n, int incr) |
void | MergeSort (Elem *array, int Size) |
void | HeapSort (Elem *array, int Size) |
void | RadixSort (Elem *array, long Size) |
void | QuickSort (Elem *array, int Size) |
void | BrightQSort (Elem *array, ulong Size) |
void | OldQuickSort (Elem *array, ulong Size) |
void | MergeSort (Elem *array, Elem *temp, int left, int right) |
void | swap (Elem *A, int i, int j) |
Variables | |
long | POW2 [17] |
|
|
|
|
|
Definition at line 99 of file OldQsort.cpp. 00100 { 00101 ULONG* ptr = new ULONG[20]; 00102 int l = 0; 00103 int r = 0; 00104 register int i = 0; 00105 ULONG k = 0; 00106 00107 int Trigger; 00108 00109 Elem T; 00110 00111 int Test = 20; 00112 int Test34 = Test * 3 / 4; // 75% Ratio to be declare sorted 00113 00114 int n = Size / Test; 00115 int n2 = (int)floor(n / 2); 00116 00117 for( i = 1; i <= Test; i++ ) 00118 { 00119 ptr[i] = (ulong)floor( n * i ); 00120 } 00121 00122 for( i = 2; i <= Test; i++ ) 00123 { 00124 T = array[ ptr[i] ] - array[ ptr[i - 1] - n2 ]; 00125 00126 if ( T < 0 ) 00127 { 00128 l++; 00129 } 00130 else 00131 { 00132 r++; 00133 } 00134 00135 printf( "[%d, %d, %d]", T, l, r ); 00136 } 00137 00138 printf( "[%d, %d, %d]", T, l, r ); 00139 00140 Trigger = r - l; 00141 00142 printf( "%d", Trigger ); 00143 00144 00145 if ( Trigger > Test34 ) 00146 { 00147 printf( "INC" ); 00148 InsertionSort( array, Size ); 00149 return; 00150 } 00151 00152 00153 if ( Trigger < (-1 * Test34) ) 00154 { 00155 printf("DEC"); 00156 00157 // Reverse the array 00158 for( k = 1; k <= ( Size / 2 + 1 ); k++ ) 00159 { 00160 swap( array, k, Size - k + 1 ); 00161 } 00162 00163 for( k = 1; k <= Size; k++ ) 00164 { 00165 printf("%d", array[k] ); 00166 } 00167 00168 InsertionSort( array, Size ); 00169 return; 00170 } 00171 00172 00173 printf( "RND" ); 00174 00175 OldQuickSort( array, Size ); 00176 00177 } // End of BrightQSort() |
|
|
|
|
|
Definition at line 59 of file Sort.cpp. Referenced by BrightQSort(), QuickSort(), and ShellSort().
|
|
|
|
Definition at line 93 of file Sort.cpp. Referenced by MergeSort().
00094 { 00095 register int i, j, k; 00096 register int mid = (left+right) / 2; 00097 00098 if (left == right) return; 00099 00100 if ( (mid-left) < MSTHRESHOLD ) 00101 { 00102 SelectionSort( &array[left], mid-left); 00103 } 00104 else 00105 { 00106 MergeSort( array, temp, left, mid ); // MergeSort first half 00107 } 00108 00109 if ( (right-mid-1) < MSTHRESHOLD ) 00110 { 00111 SelectionSort( &array[mid+1], right-mid-1 ); 00112 } 00113 else 00114 { 00115 MergeSort(array, temp, mid+1, right); // MergeSort second half 00116 } 00117 00118 // Do the merge operation. First, copy 2 halves to temp. 00119 00120 for( i = mid; i >= left; i--) 00121 { 00122 temp[i] = array[i]; 00123 } 00124 00125 for( j = 1; j <= right-mid; j++) 00126 { 00127 temp[ right - j + 1 ] = array[ j + mid ]; 00128 } 00129 00130 // Merge sublists back to array 00131 for( i = left, j = right, k = left; k <= right; k++) 00132 { 00133 if ( temp[ i ] < temp[ j ] ) 00134 { 00135 array[ k ] = temp[ i++ ]; 00136 } 00137 else 00138 { 00139 array[ k ] = temp[ j-- ]; 00140 } 00141 } 00142 } |
|
|
|
Definition at line 16 of file OldQsort.cpp. Referenced by BrightQSort().
00017 { 00018 struct QEntry QStack[100]; // Use to store variables for recursivity 00019 00020 long Top = 0; // Top & Bottom ptr 00021 long Bottom = 0; 00022 00023 long a = 0; // Inner Left & Right working ptr 00024 long b = Size-1; 00025 00026 Elem z; // Temp location for swapping stuff 00027 00028 QStack[0].Left = a; // Define the absolute left ptr 00029 QStack[0].Right = b; // Define the absolute right ptr 00030 00031 long x = 1; // Normal Middle ptr 00032 00033 while ( x > 0 ) 00034 { 00035 x--; 00036 a = QStack[x].Left; // Store Left and Right Stack value 00037 b = QStack[x].Right; 00038 00039 z = array[a]; // Give me some z value 00040 00041 Top = a; // Fix Top and Bottom range 00042 Bottom = b + 1; 00043 00044 QSBottom: // Address #1 -- Let's play with Bottom ! 00045 00046 Bottom--; 00047 00048 if ( Bottom == Top ) goto QSz; // If there is no middle than fix z 00049 00050 if ( z <= array[Bottom] ) // If z is smaller than bottom-- and retry 00051 { 00052 goto QSBottom; 00053 } 00054 else 00055 { 00056 array[Top] = array[Bottom]; 00057 } 00058 00059 QSTop: // Address #2 -- Let's play with Top ! 00060 00061 Top++; 00062 00063 if ( Bottom == Top) goto QSz; // If there is no middle than fix z 00064 00065 if ( z >= array[ Top ] ) // If z is bigger than top++ and retry 00066 { 00067 goto QSTop; 00068 } 00069 else 00070 { 00071 array[ Bottom ] = array[ Top ]; 00072 goto QSBottom; 00073 } 00074 00075 QSz: // Address #3 -- Let's fix z and continue. 00076 00077 array[Top] = z; 00078 00079 if ( (b - Top) >= 2 ) 00080 { 00081 QStack[x].Left = Top + 1; 00082 QStack[x].Right = b; 00083 x++; 00084 } 00085 00086 if ( (Bottom - a) >= 2 ) 00087 { 00088 QStack[x].Left = a; 00089 QStack[x].Right = Bottom - 1; 00090 x++; 00091 } 00092 } 00093 } |
|
Definition at line 11 of file Qsort4.cpp. 00012 { 00013 int i = 0; 00014 int j = Size - 1; 00015 int listsize = Size; 00016 00017 struct QEntry Stack[100]; 00018 00019 int top = 0; 00020 int pivot; 00021 int pivotindex, l, r; 00022 00023 Stack[top].Left = i; 00024 Stack[top].Right = j; 00025 00026 while ( top >= 0 ) 00027 { 00028 // Pop Stack 00029 i = Stack[top].Left; 00030 j = Stack[top--].Right; 00031 00032 // Findpivot 00033 pivotindex = (i+j)/2; 00034 pivot = array[pivotindex]; 00035 swap( array, pivotindex, j ); // Stick pivot at end 00036 00037 // Partition 00038 l = i-1; 00039 r = j; 00040 00041 do { 00042 while ( array[++l] < pivot ); 00043 while (r && array[--r] > pivot ); 00044 00045 swap(array, l, r); 00046 00047 } while (l < r); 00048 00049 swap(array, l, r); // Undo final swap 00050 swap(array, l, j); // Put pivot value in place 00051 00052 // Load up Stack 00053 if ( (l-i) > QSTHRESHOLD ) // Left partition 00054 { 00055 Stack[++top].Left = i; 00056 Stack[ top].Right = l-1; 00057 } 00058 00059 if ( (j-l) > QSTHRESHOLD ) // Right partition 00060 { 00061 Stack[++top].Left = l+1; 00062 Stack[ top].Right = j; 00063 } 00064 } 00065 00066 InsertionSort( array, listsize ); // Final Insertion Sort 00067 } |
|
Definition at line 156 of file Sort.cpp. 00157 { 00158 // Count[i] stores number of records in bin[i] 00159 00160 Elem* count = new Elem[ Size ]; 00161 Elem* A = array; 00162 Elem* B = new Elem[ Size ]; 00163 00164 register long n = Size; 00165 register int k = 16 / BITS; 00166 register int r = POW2[ BITS ]; 00167 00168 register int i = 0; 00169 register int j = 0; 00170 register int rtok = 1; 00171 00172 for( i = 0, rtok = 1; i < k; i++, rtok *= r) // For k digits 00173 { 00174 for( j = 0; j < r; j++) // Initialize count 00175 { 00176 count[ j ] = 0; 00177 } 00178 00179 // Count the number of records for each bin on this pass 00180 for( j = 0; j < n; j++ ) 00181 { 00182 count[ ( A[j] / rtok ) % r ]++; 00183 } 00184 00185 // Index B: count[j] will be index for last slot of bin j. 00186 for( j = 1; j < r; j++ ) 00187 { 00188 count[ j ] = count[ j - 1 ] + count[ j ]; 00189 } 00190 00191 // Put records into bins working from bottom of each bin. 00192 // Since bins fill from bottom, j counts downwards 00193 for( j = n-1; j >= 0; j-- ) 00194 { 00195 B[ --count[ ( A[j] / rtok ) % r ] ] = A[j]; 00196 } 00197 00198 for( j = 0; j < n; j++ ) // Copy B back to A 00199 { 00200 A[ j ] = B[ j ]; 00201 } 00202 } 00203 00204 if ( B != NULL ) 00205 { 00206 delete[] B; 00207 } 00208 00209 if ( count != NULL ) 00210 { 00211 delete[] count; 00212 } 00213 } |
|
Definition at line 40 of file Sort.cpp. Referenced by MergeSort().
00041 { 00042 n--; // n-1 optimization 00043 00044 // Select i'th record 00045 for( register int i = 0; i < n; i++ ) 00046 { 00047 register int lowindex = i; // Remember its index 00048 for(int j = n; j > i; j--) // Find the least value 00049 if ( array[j] < array[lowindex] ) 00050 { 00051 lowindex = j; // Put it in place 00052 } 00053 00054 swap( array, i, lowindex ); 00055 } 00056 } |
|
Definition at line 71 of file Sort.cpp. 00072 { 00073 for( register int i = n / 2; i > 2; i /= 2 ) // For each increment 00074 for( register int j = 0; j < i; j++ ) // Sort each sublist 00075 { 00076 InsertionSort( &array[j], n-j, i); 00077 } 00078 00079 InsertionSort( array, n ); 00080 } |
|
Definition at line 40 of file Sort.hpp. Referenced by BrightQSort(), BubbleSort(), InsertionSort(), smatrix::PivotMap(), QuickSort(), SelectionSort(), smatrix::Transpose(), MaxHeap::insert(), MaxHeap::remove(), MaxHeap::removemax(), and MaxHeap::siftdown().
|
|
Initial value: { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 } |