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

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

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=cmp((p+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;icmp((p+j),(p+i))) 332. { 333. data=*(p+i); 334. *(p+i)=*(p+j); 335. *(p+j)=data; 336. } 337. } 338. } 339. return; 340. } 341. 342. void paixu_charu(int *p,int leng,int (* cmp)(const

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=0&&0>cmp(&d

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=0;i--) 416. { 417. if(shunxu) 418. data[index[p[i]]-1]=p[i]; 419. else 420. data[leng-index[p[i]]]=p[i]; 421. index[p[i]]--; 422. } 423. //根据index中的位置把p中的值赋值给data 424. 425. return data;//返回排序好的数据 426. }