这段时间楼主在忙找工作的事情,必然要把数据结构和算法部分复习一下,抽空把几个经典的排序算法写了下,一方面练习一下,另一方面以后用到了就可以直接拿去了~
几点注意:
1.大部分都是按照《数据结构与算法分析》这本书上的例子写的
2.下面例子中的希尔排序并不是最优的
1 #include <iostream> 2 #include <time.h> 3 4 using namespace std; 5 6 /************************************************************************/ 7 /* 将常用的排序算法总结如下: */ 8 /************************************************************************/ 9 10 //1.插入排序 11 template <typename T> 12 int InsertSort(T array[],int N) 13 { 14 if ( array == NULL || N == 0 ) 15 return 1; 16 T tmp; 17 int j; 18 for (int p=1;p<N;p++) 19 { 20 tmp = array[p]; 21 for ( j = p; j > 0 && tmp < array[j - 1]; j -- ) 22 { 23 array[j] = array[j-1]; 24 } 25 array[j] = tmp; 26 } 27 return 0; 28 } 29 30 //2.希尔排序(n/2) 31 template <typename T> 32 int ShellSort(T array[],int N) 33 { 34 T tmp; 35 int i,j,Increment; 36 for ( Increment = N/2; Increment>0; Increment/=2 ) 37 { 38 for (i=Increment;i<N;++i) 39 { 40 tmp = array[i]; 41 for (j=i;j>=Increment && tmp < array[j-Increment];j-=Increment) 42 { 43 array[j] = array[j-Increment]; 44 } 45 array[j] = tmp; 46 } 47 } 48 return 0; 49 } 50 51 //交换例程 52 template <typename T> 53 inline void swap(T *a, T *b) 54 { 55 T temp; 56 temp = *a; 57 *a = *b; 58 *b = temp; 59 } 60 61 //3.堆排序 62 #define LeftChild(i) (2*(i)+1) 63 template <typename T> 64 void percdown(T array[], int i, int N) 65 { 66 int child; 67 T tmp = array[i]; 68 for (;LeftChild(i)<N;i=child) 69 { 70 child = LeftChild(i); 71 if (child!=N-1 && array[child+1]>array[child]) 72 child ++; 73 if (tmp<array[child]) 74 array[i] = array[child]; 75 else 76 break; 77 } 78 array[i] = tmp; 79 } 80 template <typename T> 81 void heapsort(T array[], int N) 82 { 83 int i; 84 for (i = N/2;i>=0;i--) 85 percdown(array,i,N); 86 for (i = N-1;i>0;i--) 87 { 88 swap(&array[0],&array[i]); 89 percdown(array,0,i); 90 } 91 } 92 93 //4.归并排序 94 template <typename T> 95 void Merge(T array[], T Tmparray[], int Lpos, int Rpos, int RightEnd) 96 { 97 int i,LeftEnd,NumElements,Tmppos; 98 LeftEnd = Rpos - 1; 99 Tmppos = Lpos; 100 NumElements = RightEnd - Lpos + 1; 101 102 while(Lpos<=LeftEnd && Rpos<=RightEnd) 103 { 104 if (array[Lpos]<=array[Rpos]) 105 Tmparray[Tmppos++] = array[Lpos++]; 106 else 107 Tmparray[Tmppos++] = array[Rpos++]; 108 } 109 while(Lpos<=LeftEnd) 110 Tmparray[Tmppos++] = array[Lpos++]; 111 while(Rpos<=RightEnd) 112 Tmparray[Tmppos++] = array[Rpos++]; 113 114 for (i=0;i<NumElements;i++,RightEnd--) 115 array[RightEnd] = Tmparray[RightEnd]; 116 } 117 118 template <typename T> 119 void Msort(T array[], T Tmparray[], int left, int right) 120 { 121 int center; 122 if (left<right) 123 { 124 center = (left + right)/2; 125 Msort(array,Tmparray,left,center); 126 Msort(array,Tmparray,center+1,right); 127 Merge(array,Tmparray,left,center+1,right); 128 } 129 } 130 131 template <typename T> 132 void Mergesort(T array[], int N) 133 { 134 T *Tmparray; 135 Tmparray = new T[N]; 136 if (Tmparray!=NULL) 137 { 138 Msort(array,Tmparray,0,N-1); 139 delete [] Tmparray; 140 } 141 else 142 cout<<"error"<<endl; 143 } 144 145 146 //5.快速排序(编程珠玑上未优化) 147 template <typename T> 148 int qsort(T array[], int left, int right) 149 { 150 if(left >= right) 151 return 0; 152 T pivot = array[left]; 153 int i,j; 154 i = left; 155 j = right+1; 156 for (;;) 157 { 158 while(array[++i]<pivot){} 159 while(array[--j]>pivot){} 160 if (i<j) 161 swap(&array[i],&array[j]); 162 else 163 break; 164 } 165 swap(&array[left],&array[j]); 166 167 qsort(array,left,j-1); 168 qsort(array,j+1,right); 169 170 return 0; 171 } 172 173 //6.优化过的快速排序 174 template <typename T> 175 inline T median3(T array[], int left, int right) 176 { 177 int center = (left + right)/2; 178 179 if (array[left]>array[center]) 180 swap(&array[left],&array[center]); 181 if (array[left]>array[right]) 182 swap(&array[left],&array[right]); 183 if (array[center]>array[right]) 184 swap(&array[center],&array[right]); 185 186 swap(&array[center],&array[right-1]); 187 return array[right-1]; 188 } 189 190 #define Cutoff 3 191 template <typename T> 192 int qsortbest(T array[], int left, int right) 193 { 194 int i,j; 195 T pivot; 196 197 if (right - left >= Cutoff) 198 { 199 pivot = median3(array,left,right); 200 i = left; 201 j = right - 1; 202 for (;;) 203 { 204 while(array[++i]<pivot){} 205 while(array[--j]>pivot){} 206 if (i<j) 207 swap(&array[i],&array[j]); 208 else 209 break; 210 } 211 swap(&array[i],&array[right-1]); 212 213 qsortbest(array,left,i-1); 214 qsortbest(array,i+1,right); 215 } 216 else 217 InsertSort(array+left,right-left+1); 218 return 0; 219 } 220 221 222 223 224 int main() 225 { 226 int chose; 227 int *array; 228 int N; 229 cout<<"输入数据量N: "; 230 cin>>N; 231 cout<<"\n输入排序方式:"<<"\n1.插入排序\n2.希尔排序\n3.堆排序\n4.归并排序\n5.快速排序(编程珠玑)\n6.快速排序(优化)"<<endl; 232 cin>>chose; 233 234 double tbegin,tend; 235 236 srand((unsigned int)time(NULL)); 237 array = new int[N]; 238 for (int i=0;i<N;++i) 239 { 240 *(array+i) = rand(); 241 } 242 243 tbegin = (double)clock(); 244 switch(chose) 245 { 246 case 1: 247 InsertSort(array,N); 248 break; 249 case 2: 250 ShellSort(array,N); 251 break; 252 case 3: 253 heapsort(array,N); 254 break; 255 case 4: 256 Mergesort(array,N); 257 break; 258 case 5: 259 qsort(array,0,N-1); 260 break; 261 case 6: 262 qsortbest(array,0,N-1); 263 break; 264 } 265 tend = (double)clock(); 266 267 for (int i=0;i<N;++i) 268 { 269 cout<<array[i]<<'\t'; 270 } 271 cout<<"\n时间花费:"<<tend - tbegin<<endl; 272 273 }