当前位置:首页 > C语言各种排序源代码
273. //所有的数据都找到了自己的位置,自
然就等于排好序了~~~~ 274. } 275. 276. return; 277. } 278. 279. int kuaisu_dingwei(int *p,int tou,int wei,int (*
cmp)(const void* a,const void* b))//快速排序,对数据中的一位进行定位,返回其位置,并且使左边的都>=或<=右边 280. { 281. int data=p[tou+(wei-tou)/2]; 282. p[tou+(wei-tou)/2]=p[tou]; 283. //这里是选择了中间的那一位 284. //保存中间位数据的值,并把第一位的值赋给中
间位 285. 286. while(tou )) 289. wei--; 290. *(p+tou)=*(p+wei); 291. //把>或<的数据移到左边 292. 293. while(tou ,&data)) 294. tou++; 295. *(p+wei)=*(p+tou); 296. //把>或<的数据移到右边 297. } 298. //使左边的都>=或<=右边 299. 300. *(p+tou)=data; //这里也可以用wei,因为 tou=wei 301. return tou; //返回位置 302. } 303. 304. void paixu_maopao(int* p,int leng,int (* cmp)(const void* a,const void* b))//冒泡排序,跳过 305. { 306. int data; 307. 308. for(int i=0;i 309. { 310. for(int j=leng-1;j>i;j--) 311. { 312. if(0>cmp((p+j),(p+j-1))) 313. { 314. data=*( p+j); 315. *(p+j)= *(p+j-1); 316. *(p+j-1 )=data; 317. } 318. } 319. } 320. return; 321. } 322. 323. void paixu_xuanze(int* p,int leng,int (* cmp)(const void* a,const void* b))//选择排序,跳过 324. { 325. int data; 326. 327. for(int i=0;i void* a,const void* b))//插入排序,跳过 343. { 344. int data; 345. int index; 346. 347. for(int i=1;i 348. { 349. data=*(p+i); 350. index=i; 351. while(index>0&&0>cmp(&data,(p+ind ex-1))) 352. { 353. *(p+index)=*(p+index-1); 354. index--; 355. } 356. *(p+index)=data; 357. } 358. 359. return; 360. } 361. 362. void paixu_xier(int* p,int leng,int (* cmp)(const void* a,const void* b))//希尔排序 363. { 364. int index; 365. int data; 366. int n; 367. 368. for(n=leng/2;n>0;n/=2) //把数据进行分 组,然后对没一组进行插入排序 369. { 370. for(int i=n;i ata,(p+index))) 375. { 376. p[index+n]=p[index]; 377. index-=n; 378. } 379. p[index+n]=data; 380. } 381. //上面把n当成1,就是插入排序了, 一模一样~~~~ 382. //最终n就是要变成1的,进行一个真 正的插入排序(最后一趟) 383. //之所以比插入快,是因为之前的排 序使最后一趟插入是不需要擦太深~~~~ 384. } 385. return; 386. } 387. 388. int* paixu_yiersan(int* p,int leng,int (* cmp)(const void* a,const void* b))//计数排序 389. { 390. int max=0; 391. for(int i=0;i 把index中的数据初始化为0 406. 407. for(int i=0;i
共分享92篇相关文档