C语言各种排序源代码 联系客服

发布时间 : 星期三 文章C语言各种排序源代码更新完毕开始阅读5f1a2e48e518964bcf847cf8

130. //paixu_xuanze(p,leng,cmp

); 131. break; 132. 133. case PAIXU_XIER: 134. paixu_xier(p,leng,cmp); 135. 136. case PAIXU_YIERSAN: 137. data=paixu_yiersan(p,leng

,cmp); 138. break; 139. 140. case PAIXU_GESHIBAI: 141. paixu_geshibai(p,leng,cmp

); 142. break; 143. 144. case PAIXU_DUI: 145. paixu_dui(p,leng,cmp); 146. break; 147. 148. case PAIXU_QSORT: 149. qsort(p,leng,sizeof(int),

cmp); 150. break; 151. 152. default:break; 153. } 154. //根据style传来的的值对号入座,调用不同的

方法排序 155. 156. QueryPerformanceCounter(&litmp); 157. t2_long=litmp.QuadPart; 158. //记下排序后的时间 159. 160. 161. if(PAIXU_GUIBING==style||PAIXU_YIERSAN==s

tyle) 162. data_fuzhi(p,data,leng); //

拷贝数据 163. 164. return (t2_long-t1_long)/t_avg; //返回

排序所用时间 165. }

166. 167. void data_shuchu(int* p,int leng) //打印数

组 168. { 169. for(int i=0;i

数据 180. { 181. for(int i=0;i

cmp)(const void* a,const void* b)) //归并排序 187. { 188. if(leng<=1) //长度小于

等于1当然就不要排序了~~~~ 189. return p; 190. 191. int zuo_leng=leng/2; 192. int you_leng=leng-zuo_leng; 193. int* zuo_data=new int[zuo_leng]; 194. int* you_data=new int[you_leng]; 195. //把数据切成两半所需要的用的变量 196. //分别是用来存放左右两边的长度和数据 197. 198. for(int i=0;i

);

205. //用传进来的数据p分别给zuo_data\\you_data

变量赋值 206. 207. 208. zuo_data=paixu_guibing(zuo_data,zuo_leng,

cmp); 209. you_data=paixu_guibing(you_data,you_leng,

cmp); 210. //调用自己,把左边的一半再分成两半,右边也

一样 211. 212. 213. return

guibing_hebing(zuo_data,zuo_leng,you_data,you_leng,cmp);//对两边的数据进行排序与合并,返回合并后的数据 214. } 215. 216. int* guibing_hebing(int* zuo_data,int

zuo_leng,int* you_data,int you_leng,int (* cmp)(const void* a,const void* b)) //归并排序之对两边的数据进行排序与合并,返回合并后的数据 217. { 218. int* data=new int[zuo_leng+you_leng];//用

来存放左右两边合并的数据 219. 220. int zuo=0; 221. int you=0; 222. 223. while(zuo=cmp((zuo_data+zuo),(you_data

+you))) 226. { 227. *(data+zuo+you)=*(zuo_data+

zuo); 228. zuo++; 229. } 230. else 231. { 232. *(data+zuo+you)=*(you_data+

you); 233. you++; 234. } 235. }

236. //上面是根据比较左右两边的大小决定是谁先

给data赋值,一个一个的 237. //直到有一边没数据了,就不用比较了~~~ 238. 239. while(zuo

个while会执行, 244. //如果左右都有数据是跳不出上面那段循环的 245. 246. return data; //返回合并后的数据 247. } 248. 249. void paixu_kuaisu(int* p,int leng,int (* cmp)(const

void* a,const void* b)) //快速排序 250. { 251. int* stack=new int[leng*2]; 252. int top=0; 253. //用来实现栈的功能 254. 255. int tou=0; 256. int wei=leng-1; 257. int index; 258. 259. while(tou

/对数据中的一位进行定位,返回其位置,并且使左边的都>=或<=右边 262. 263. stack[top++]=index+1; 264. stack[top++]=wei; 265. //把右边的先保存起来 266. 267. wei=index-1; //继续左边的定

位 268. while(tou>=wei&&top) //右边的

都定位完了,就定位左边的 269. { 270. wei=stack[--top]; 271. tou=stack[--top]; 272. }