sort

  1 /*
  2 * Copyright 2016 E-Tool, Inc.
  3 */
  4 
  5 #ifndef sort_h
  6 #define sort_h
  7 
  8 #include <vector>
  9 #include <math.h>
 10 using std::vector;
 11 template <typename T>
 12 
 13 class Sort {
 14 public:
 15     /*
 16     *  Selection Sort
 17     */
 18     static void selection_sort(vector<T> &arr) {
 19         int i, j;
 20         for (i = 0;i < arr.size() - 1;i++) {
 21             int min = i;
 22             for (j = i + 1;j < arr.size();j++) {
 23                 if (arr[j] < arr[min])
 24                     min = j;
 25             }
 26             if (min != i) {
 27                 arr[min] = arr[min] + arr[i];
 28                 arr[i] = arr[min] - arr[i];
 29                 arr[min] = arr[min] - arr[i];
 30             }
 31         }
 32     }
 33     /*
 34     *  Swap Sort
 35     */
 36     static void swap_sort(vector<T> &arr) {
 37         int i, j;
 38         for (i = 0;i < arr.size();i++) {
 39             for (j = 0;j < arr.size() - i - 1;j++) {
 40                 if (arr[j + 1] < arr[j]) {
 41                     arr[j + 1] = arr[j + 1] + arr[j];
 42                     arr[j] = arr[j + 1] - arr[j];
 43                     arr[j + 1] = arr[j + 1] - arr[j];
 44                 }
 45             }
 46         }
 47     }
 48     /*
 49     *  Insert Sort
 50     */
 51     static void insert_sort(vector<T> &arr) {
 52         int i, j;
 53         for (i = 0;i < arr.size();i++) {
 54             T tmp = arr[i];
 55             j = i - 1;
 56             while (j >= 0 && arr[j] > tmp) {
 57                 arr[j + 1] = arr[j];
 58                 j--;
 59             }
 60             arr[j + 1] = tmp;
 61         }
 62     }
 63     /*
 64     *  Quick Sort
 65     */
 66     static void once_quick_sort(vector<T> &arr, int low, int high) {
 67         if (low >= high) return;
 68         T tmp = arr[low];
 69         int first = low, last = high;
 70         while (first != last) {
 71             while (first < last&&arr[last] >= tmp) {
 72                 last--;
 73             }
 74             arr[first] = arr[last];
 75             while (first < last&&arr[first] <= tmp) {
 76                 first++;
 77             }
 78             arr[last] = arr[first];
 79         }
 80         arr[first] = tmp;
 81         once_quick_sort(arr, low, first - 1);
 82         once_quick_sort(arr, first + 1, high);
 83     }
 84     static void quick_sort(vector<T> &arr) {
 85         once_quick_sort(arr, 0, arr.size() - 1);
 86     }
 87 
 88     /*
 89     *  Heap Sort
 90     */
 91     static void heap_adjust(vector<T> &arr, int i, int nLength) {//MAX Heap
 92         int nChild;
 93         for (;2 * i + 1 < nLength;i = nChild) {
 94             nChild = 2 * i + 1;
 95             if (nChild<nLength - 1 && arr[nChild + 1]>arr[nChild])
 96                 ++nChild;
 97             if (arr[i] < arr[nChild]) {
 98                 arr[i] = arr[nChild] ^ arr[i];
 99                 arr[nChild] = arr[nChild] ^ arr[i];
100                 arr[i] = arr[nChild] ^ arr[i];
101             }
102             else break;
103         }
104     }
105     static void heap_sort(vector<T> &arr) {
106         int i;
107         for (i = arr.size() / 2 - 1;i >= 0;--i) //Construction of the heap
108             heap_adjust(arr, i, arr.size());
109         for (i = arr.size() - 1;i > 0;--i) { //Adjust the heap
110             arr[i] = arr[0] ^ arr[i];
111             arr[0] = arr[0] ^ arr[i];
112             arr[i] = arr[0] ^ arr[i];
113             heap_adjust(arr, 0, i);
114         }
115     }
116     /*
117     *  Shell Sort
118     */
119     static void shell_sort(vector<T> &arr) {
120         int i, j, k;
121         int t = int(log(arr.size() + 1) / log(2));
122         for (i = 1;i <=t;i++) {
123             int dk = int(pow(2, t - i + 1)-1);
124             for (j = dk;j < arr.size();j++) {
125                 int temp=arr[j];
126                 for (k = j - dk;(k >= j%dk) && arr[k] > temp;k-=dk) {
127                     arr[k + dk] = arr[k];
128                 }
129                 if (k != j - dk) {
130                     arr[k + dk] = temp;
131                 }
132             }
133         }
134     }
135     /*
136     *  Binary Insert Sort
137     */
138     static void binary_insert_sort(vector<T> &arr) {
139         int i, j;
140         for (i = 1;i < arr.size();i++) {
141             T tmp = arr[i];
142             int low=0, high=i-1;
143             while (low <= high) {
144                 int mid = (low + high) / 2;
145                 if (arr[i] <= arr[mid])
146                     high = mid-1;
147                 else low = mid+1;
148             }
149             j = i - 1;
150             while (j >= low) {
151                 arr[j + 1] = arr[j];
152                 j--;
153             }
154             arr[low] = tmp;
155         }
156     }
157     /*
158     *  Radix Sort
159     */
160     static void radix_sort(vector<T> &arr) {
161         int d;
162         vector<T> tmp(arr.size());
163         vector<int> count(10);
164         int i, j, k;
165         int radix = 1;
166         bool state ;
167         for (i = 1;;i++) {
168             state = false;
169             for (j = 0;j < 10;j++) {
170                 count[j] = 0;
171             }
172             for (j = 0;j < arr.size();j++) {
173                 k = (arr[j] / radix) % 10;
174                 if (k != 0) state = true;
175                 count[k]++;
176             }
177             if (!state) {
178                 return;
179             }
180             for (j = 1;j < 10;j++) {
181                 count[j] = count[j - 1] + count[j];
182             }
183             for (j = arr.size() - 1;j >= 0;j--) {
184                 k = (arr[j] / radix) % 10;
185                 tmp[count[k] - 1] = arr[j];
186                 count[k]--;
187             }
188             for (j = 0;j < arr.size();j++) {
189                 arr[j] = tmp[j];
190             }
191             radix *= 10;
192         }
193     }
194     /*
195     * Merge Sort
196     */
197     static void merge(vector<T> &arr,int low,int high) {
198         if (low >= high) {
199             return;
200         }
201         int mid = (low + high) / 2;
202         merge(arr,low,mid);
203         merge(arr,mid+1,high);
204         int i = low, j = mid + 1;
205         vector<T> tmp;
206         while (i <= mid&&j <= high) {
207             if (arr[i] < arr[j]) {
208                 tmp.push_back(arr[i++]);
209             }
210             else tmp.push_back(arr[j++]);
211         }
212         while (i <= mid) {
213             tmp.push_back(arr[i++]);
214         }
215         while (j <= high) {
216             tmp.push_back(arr[j++]);
217         }
218         for (i = low;i < low + tmp.size();i++) {
219             arr[i] = tmp[i-low];
220         }
221     }
222     static void merge_sort(vector<T> &arr) {
223         merge(arr,0,arr.size()-1);
224     }
225     /*
226     *  bitmap_sort
227     */
228     static void bitmap_sort(vector<int> &arr) {
229         static unsigned int BitsSetTable32[32] =
230         {
231             0x80000000,0x40000000,0x20000000,0x10000000,
232             0x08000000,0x04000000,0x02000000,0x01000000,
233             0x00800000,0x00400000,0x00200000,0x00100000,
234             0x00080000,0x00040000,0x00020000,0x00010000,
235             0x00008000,0x00004000,0x00002000,0x00001000,
236             0x00000800,0x00000400,0x00000200,0x00000100,
237             0x00000080,0x00000040,0x00000020,0x00000010,
238             0x00000008,0x00000004,0x00000002,0x00000001,
239         };
240         const int INT_BIT = 32;
241         int i,j;
242         int maxV = -1;
243         for (i = 0;i < arr.size();i++) {
244             if (arr[i] > maxV) maxV = arr[i];
245         }
246         vector<int> map((maxV+1)/INT_BIT+1);
247         for (i = 0;i < arr.size();i++) {
248             map[arr[i] / INT_BIT] = map[arr[i] / INT_BIT] | BitsSetTable32[arr[i] % INT_BIT];
249         }
250         arr.clear();
251         for (i = 0;i < map.size();i++) {
252             int t = map[i];
253             for (j = 0;j < 32;j++) {
254                 if (t&BitsSetTable32[j]) {
255                     arr.push_back(32*i+j);
256                 }
257             }
258         }
259     }
260 };
261 
262 #endif

 

posted @ 2016-09-22 18:30  BelFuture  阅读(231)  评论(0编辑  收藏  举报
The horizon of life is broadened chiefly by the enlargement of the heart.