`
devgis
  • 浏览: 134418 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

排序算法总结

 
阅读更多

在工作中,用到了排序。顺便总结了一下。以下排序的各算法,我都验证无误。

包含冒泡排序、摇动排序、梳子排序、标准插入排序、优化的插入排序、

希尔排序、标准归并排序、优化的归并排序、

标准快速排序、无递归的快速排序、随机的快速排序、中间值的快速排序、

堆排序。

[delphi]view plaincopy
  1. unitunit2;
  2. interface
  3. //冒泡排序
  4. procedureBubbleSort(varabc:arrayofInteger);
  5. //摇动排序
  6. procedureShakerSort(varabc:arrayofInteger);
  7. //梳子排序
  8. procedureCombSort(varabc:arrayofInteger);
  9. //选择排序
  10. procedureSelectionSort(varabc:arrayofInteger);
  11. //标准插入排序
  12. procedureInsertionSortStd(varabc:arrayofInteger);
  13. //优化的插入排序
  14. procedureInsertionSort(varabc:arrayofInteger);
  15. //希尔排序
  16. procedureShellSort(varabc:arrayofInteger);
  17. //标准归并排序
  18. procedureMergeSortStd(varabc:arrayofInteger);
  19. //优化的归并排序
  20. procedureMergeSort(varabc:arrayofInteger);
  21. //标准快速排序
  22. procedureQuickSortStd(varabc:arrayofInteger);
  23. //无递归的快速排序
  24. procedureQuickSortNoRecurse(varabc:arrayofInteger);
  25. //随机的快速排序
  26. procedureQuickSortRandom(varabc:arrayofInteger);
  27. //中间值的快速排序
  28. procedureQuickSortMedian(varabc:arrayofInteger);
  29. //优化的插入快速排序
  30. procedureQuickSort(varabc:arrayofInteger);
  31. //堆排序
  32. procedureHeapSort(varabc:arrayofInteger);
  33. implementation
  34. //冒泡排序
  35. procedureBubbleSort(varabc:arrayofInteger);
  36. var
  37. i,j:Integer;
  38. Temp:Integer;
  39. Done:boolean;
  40. begin
  41. fori:=0toHigh(abc)do
  42. begin
  43. Done:=true;
  44. forj:=High(abc)+1downto0do
  45. ifabc[j]<abc[j-1]then
  46. begin
  47. Temp:=abc[j];
  48. abc[j]:=abc[j-1];
  49. abc[j-1]:=Temp;
  50. Done:=false;
  51. end;
  52. ifDonethen
  53. Exit;
  54. end;
  55. end;
  56. //梳子排序
  57. procedureCombSort(varabc:arrayofInteger);
  58. var
  59. i,j:Integer;
  60. Temp:Integer;
  61. Done:boolean;
  62. Gap:Integer;
  63. begin
  64. Gap:=High(abc);
  65. repeat
  66. Done:=true;
  67. Gap:=(longint(Gap)*10)div13;
  68. if(Gap<1)then
  69. Gap:=1
  70. elseif(Gap=9)or(Gap=10)then
  71. Gap:=11;
  72. fori:=0to(High(abc)-Gap)do
  73. begin
  74. j:=i+Gap;
  75. ifabc[j]<abc[i]then
  76. begin
  77. Temp:=abc[j];
  78. abc[j]:=abc[i];
  79. abc[i]:=Temp;
  80. Done:=false;
  81. end;
  82. end;
  83. untilDoneand(Gap=1);
  84. end;
  85. //标准插入排序
  86. procedureInsertionSortStd(varabc:arrayofInteger);
  87. var
  88. i,j:Integer;
  89. Temp:Integer;
  90. begin
  91. fori:=0toHigh(abc)do
  92. begin
  93. Temp:=abc[i];
  94. j:=i;
  95. while(j>0)and(Temp<abc[j-1])do
  96. begin
  97. abc[j]:=abc[j-1];
  98. dec(j);
  99. end;
  100. abc[j]:=Temp;
  101. end;
  102. end;
  103. //优化的插入排序
  104. procedureInsertionSort(varabc:arrayofInteger);
  105. var
  106. i,j:Integer;
  107. IndexOfMin:Integer;
  108. Temp:Integer;
  109. begin
  110. IndexOfMin:=0;
  111. fori:=0toHigh(abc)do
  112. ifabc[i]<abc[IndexOfMin]then
  113. IndexOfMin:=i;
  114. if(0<>IndexOfMin)then
  115. begin
  116. Temp:=abc[0];
  117. abc[0]:=abc[IndexOfMin];
  118. abc[IndexOfMin]:=Temp;
  119. end;
  120. fori:=0+2toHigh(abc)do
  121. begin
  122. Temp:=abc[i];
  123. j:=i;
  124. whileTemp<abc[j-1]do
  125. begin
  126. abc[j]:=abc[j-1];
  127. dec(j);
  128. end;
  129. abc[j]:=Temp;
  130. end;
  131. end;
  132. //选择排序
  133. procedureSelectionSort(varabc:arrayofInteger);
  134. var
  135. i,j:Integer;
  136. IndexOfMin:Integer;
  137. Temp:Integer;
  138. begin
  139. fori:=0toHigh(abc)do
  140. begin
  141. IndexOfMin:=i;
  142. forj:=itoHigh(abc)+1do
  143. ifabc[j]<abc[IndexOfMin]then
  144. IndexOfMin:=j;
  145. Temp:=abc[i];
  146. abc[i]:=abc[IndexOfMin];
  147. abc[IndexOfMin]:=Temp;
  148. end;
  149. end;
  150. //摇动排序
  151. procedureShakerSort(varabc:arrayofInteger);
  152. var
  153. i:Integer;
  154. Temp:Integer;
  155. iMin,iMax:Integer;
  156. begin
  157. iMin:=0;
  158. iMax:=High(abc)-Low(abc)+1;
  159. while(iMin<iMax)do
  160. begin
  161. fori:=iMaxdownto0do
  162. ifabc[i]<abc[i-1]then
  163. begin
  164. Temp:=abc[i];
  165. abc[i]:=abc[i-1];
  166. abc[i-1]:=Temp;
  167. end;
  168. inc(iMin);
  169. fori:=0toiMaxdo
  170. ifabc[i]<abc[i-1]then
  171. begin
  172. Temp:=abc[i];
  173. abc[i]:=abc[i-1];
  174. abc[i-1]:=Temp;
  175. end;
  176. dec(iMax);
  177. end;
  178. end;
  179. //希尔排序
  180. procedureShellSort(varabc:arrayofInteger);
  181. var
  182. i,j:Integer;
  183. h:Integer;
  184. Temp:Integer;
  185. Ninth:Integer;
  186. begin
  187. h:=1;
  188. Ninth:=High(abc)div9;
  189. while(h<=Ninth)do
  190. h:=(h*3)+1;
  191. while(h>0)do
  192. begin
  193. fori:=htoHigh(abc)do
  194. begin
  195. Temp:=abc[i];
  196. j:=i;
  197. while(j>=(0+h))and(Temp<abc[j-h])do
  198. begin
  199. abc[j]:=abc[j-h];
  200. dec(j,h);
  201. end;
  202. abc[j]:=Temp;
  203. end;
  204. h:=hdiv3;
  205. end;
  206. end;
  207. //标准归并排序
  208. procedureMergeSortStd(varabc:arrayofInteger);
  209. procedureMSS(varabc:arrayofInteger;aFirst:Integer;aLast:Integer;aTempList:arrayofInteger);
  210. var
  211. Mid:Integer;
  212. i,j:Integer;
  213. ToInx:Integer;
  214. FirstCount:Integer;
  215. begin
  216. Mid:=(aFirst+aLast)div2;
  217. if(aFirst<Mid)then
  218. MSS(abc,aFirst,Mid,aTempList);
  219. if(succ(Mid)<aLast)then
  220. MSS(abc,succ(Mid),aLast,aTempList);
  221. FirstCount:=succ(Mid-aFirst);
  222. Move(abc[aFirst],aTempList[0],FirstCount*sizeof(pointer));
  223. i:=0;
  224. j:=succ(Mid);
  225. ToInx:=aFirst;
  226. while(i<FirstCount)and(j<=aLast)do
  227. begin
  228. if(aTempList[i]<=abc[j])then
  229. begin
  230. abc[ToInx]:=aTempList[i];
  231. inc(i);
  232. end
  233. else
  234. begin
  235. abc[ToInx]:=abc[j];
  236. inc(j);
  237. end;
  238. inc(ToInx);
  239. end;
  240. if(i<FirstCount)then
  241. Move(aTempList[i],abc[ToInx],(FirstCount-i)*sizeof(pointer));
  242. end;
  243. var
  244. TempList:arrayofInteger;
  245. begin
  246. if(0<High(abc))then
  247. begin
  248. SetLength(TempList,High(abc)div2);
  249. MSS(abc,0,High(abc),TempList);
  250. end;
  251. end;
  252. //优化的归并排序
  253. procedureMergeSort(varabc:arrayofInteger);
  254. const
  255. MSCutOff=15;
  256. procedureMSInsertionSort(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  257. var
  258. i,j:Integer;
  259. IndexOfMin:Integer;
  260. Temp:Integer;
  261. begin
  262. IndexOfMin:=aFirst;
  263. fori:=succ(aFirst)toaLastdo
  264. ifabc[i]<abc[IndexOfMin]then
  265. IndexOfMin:=i;
  266. if(aFirst<>IndexOfMin)then
  267. begin
  268. Temp:=abc[aFirst];
  269. abc[aFirst]:=abc[IndexOfMin];
  270. abc[IndexOfMin]:=Temp;
  271. end;
  272. fori:=aFirst+2toaLastdo
  273. begin
  274. Temp:=abc[i];
  275. j:=i;
  276. whileTemp<abc[j-1]do
  277. begin
  278. abc[j]:=abc[j-1];
  279. dec(j);
  280. end;
  281. abc[j]:=Temp;
  282. end;
  283. end;
  284. procedureMS(varabc:arrayofInteger;aFirst:Integer;aLast:Integer;aTempList:arrayofInteger);
  285. var
  286. Mid:Integer;
  287. i,j:Integer;
  288. ToInx:Integer;
  289. FirstCount:Integer;
  290. begin
  291. Mid:=(aFirst+aLast)div2;
  292. if(aFirst<Mid)then
  293. if(Mid-aFirst)<=MSCutOffthen
  294. MSInsertionSort(abc,aFirst,Mid)
  295. else
  296. MS(abc,aFirst,Mid,aTempList);
  297. if(succ(Mid)<aLast)then
  298. if(aLast-succ(Mid))<=MSCutOffthen
  299. MSInsertionSort(abc,succ(Mid),aLast)
  300. else
  301. MS(abc,succ(Mid),aLast,aTempList);
  302. FirstCount:=succ(Mid-aFirst);
  303. Move(abc[aFirst],aTempList[0],FirstCount*sizeof(pointer));
  304. i:=0;
  305. j:=succ(Mid);
  306. ToInx:=aFirst;
  307. while(i<FirstCount)and(j<=aLast)do
  308. begin
  309. if(aTempList[i]<=abc[j])then
  310. begin
  311. abc[ToInx]:=aTempList[i];
  312. inc(i);
  313. end
  314. else
  315. begin
  316. abc[ToInx]:=abc[j];
  317. inc(j);
  318. end;
  319. inc(ToInx);
  320. end;
  321. if(i<FirstCount)then
  322. Move(aTempList[i],abc[ToInx],(FirstCount-i)*sizeof(pointer));
  323. end;
  324. var
  325. TempList:arrayofInteger;
  326. begin
  327. if(0<High(abc))then
  328. begin
  329. SetLength(TempList,High(abc)div2);
  330. MS(abc,0,High(abc),TempList);
  331. end;
  332. end;
  333. //标准快速排序
  334. procedureQuickSortStd(varabc:arrayofInteger);
  335. procedureQSS(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  336. var
  337. L,R:Integer;
  338. Pivot:Integer;
  339. Temp:Integer;
  340. begin
  341. while(aFirst<aLast)do
  342. begin
  343. Pivot:=abc[(aFirst+aLast)div2];
  344. L:=pred(aFirst);
  345. R:=succ(aLast);
  346. whiletruedo
  347. begin
  348. repeat
  349. dec(R);
  350. until(abc[R]<=Pivot);
  351. repeat
  352. inc(L);
  353. until(abc[L]>=Pivot);
  354. if(L>=R)then
  355. Break;
  356. Temp:=abc[L];
  357. abc[L]:=abc[R];
  358. abc[R]:=Temp;
  359. end;
  360. if(aFirst<R)then
  361. QSS(abc,aFirst,R);
  362. aFirst:=succ(R);
  363. end;
  364. end;
  365. begin
  366. QSS(abc,0,High(abc));
  367. end;
  368. //无递归的快速排序
  369. procedureQuickSortNoRecurse(varabc:arrayofInteger);
  370. procedureQSNR(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  371. var
  372. L,R:Integer;
  373. Pivot:Integer;
  374. Temp:Integer;
  375. Stack:array[0..63]ofInteger;{allowsfor2billionitems}
  376. SP:Integer;
  377. begin
  378. Stack[0]:=aFirst;
  379. Stack[1]:=aLast;
  380. SP:=2;
  381. while(SP<>0)do
  382. begin
  383. dec(SP,2);
  384. aFirst:=Stack[SP];
  385. aLast:=Stack[SP+1];
  386. while(aFirst<aLast)do
  387. begin
  388. Pivot:=abc[(aFirst+aLast)div2];
  389. L:=pred(aFirst);
  390. R:=succ(aLast);
  391. whiletruedo
  392. begin
  393. repeat
  394. dec(R);
  395. until(abc[R]<=Pivot);
  396. repeat
  397. inc(L);
  398. until(abc[L]>=Pivot);
  399. if(L>=R)then
  400. Break;
  401. Temp:=abc[L];
  402. abc[L]:=abc[R];
  403. abc[R]:=Temp;
  404. end;
  405. if(R-aFirst)<(aLast-R)then
  406. begin
  407. Stack[SP]:=succ(R);
  408. Stack[SP+1]:=aLast;
  409. inc(SP,2);
  410. aLast:=R;
  411. end
  412. else
  413. begin
  414. Stack[SP]:=aFirst;
  415. Stack[SP+1]:=R;
  416. inc(SP,2);
  417. aFirst:=succ(R);
  418. end;
  419. end;
  420. end;
  421. end;
  422. begin
  423. QSNR(abc,0,High(abc));
  424. end;
  425. //随机的快速排序
  426. procedureQuickSortRandom(varabc:arrayofInteger);
  427. procedureQSR(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  428. var
  429. L,R:Integer;
  430. Pivot:Integer;
  431. Temp:Integer;
  432. begin
  433. while(aFirst<aLast)do
  434. begin
  435. R:=aFirst+Random(aLast-aFirst+1);
  436. L:=(aFirst+aLast)div2;
  437. Pivot:=abc[R];
  438. abc[R]:=abc[L];
  439. abc[L]:=Pivot;
  440. L:=pred(aFirst);
  441. R:=succ(aLast);
  442. whiletruedo
  443. begin
  444. repeat
  445. dec(R);
  446. until(abc[R]<=Pivot);
  447. repeat
  448. inc(L);
  449. until(abc[L]>=Pivot);
  450. if(L>=R)then
  451. Break;
  452. Temp:=abc[L];
  453. abc[L]:=abc[R];
  454. abc[R]:=Temp;
  455. end;
  456. if(aFirst<R)then
  457. QSR(abc,aFirst,R);
  458. aFirst:=succ(R);
  459. end;
  460. end;
  461. begin
  462. QSR(abc,0,High(abc));
  463. end;
  464. //中间值的快速排序
  465. procedureQuickSortMedian(varabc:arrayofInteger);
  466. procedureQSM(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  467. var
  468. L,R:Integer;
  469. Pivot:Integer;
  470. Temp:Integer;
  471. begin
  472. while(aFirst<aLast)do
  473. begin
  474. if(aLast-aFirst)>=2then
  475. begin
  476. R:=(aFirst+aLast)div2;
  477. if(abc[aFirst]>abc[R])then
  478. begin
  479. Temp:=abc[aFirst];
  480. abc[aFirst]:=abc[R];
  481. abc[R]:=Temp;
  482. end;
  483. if(abc[aFirst]>abc[aLast])then
  484. begin
  485. Temp:=abc[aFirst];
  486. abc[aFirst]:=abc[aLast];
  487. abc[aLast]:=Temp;
  488. end;
  489. if(abc[R]>abc[aLast])then
  490. begin
  491. Temp:=abc[R];
  492. abc[R]:=abc[aLast];
  493. abc[aLast]:=Temp;
  494. end;
  495. Pivot:=abc[R];
  496. end
  497. else
  498. Pivot:=abc[aFirst];
  499. L:=pred(aFirst);
  500. R:=succ(aLast);
  501. whiletruedo
  502. begin
  503. repeat
  504. dec(R);
  505. until(abc[R]<=Pivot);
  506. repeat
  507. inc(L);
  508. until(abc[L]>=Pivot);
  509. if(L>=R)then
  510. Break;
  511. Temp:=abc[L];
  512. abc[L]:=abc[R];
  513. abc[R]:=Temp;
  514. end;
  515. if(aFirst<R)then
  516. QSM(abc,aFirst,R);
  517. aFirst:=succ(R);
  518. end;
  519. end;
  520. begin
  521. QSM(abc,0,High(abc));
  522. end;
  523. //优化插入的快速排序
  524. procedureQuickSort(varabc:arrayofInteger);
  525. const
  526. QSCutOff=15;
  527. procedureQSInsertionSort(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  528. var
  529. i,j:Integer;
  530. IndexOfMin:Integer;
  531. Temp:Integer;
  532. begin
  533. IndexOfMin:=aFirst;
  534. j:=aFirst+QSCutOff;{!!.01}
  535. if(j>aLast)then
  536. j:=aLast;
  537. fori:=succ(aFirst)tojdo
  538. ifabc[i]<abc[IndexOfMin]then
  539. IndexOfMin:=i;
  540. if(aFirst<>IndexOfMin)then
  541. begin
  542. Temp:=abc[aFirst];
  543. abc[aFirst]:=abc[IndexOfMin];
  544. abc[IndexOfMin]:=Temp;
  545. end;
  546. {nowsortviafastinsertionmethod}
  547. fori:=aFirst+2toaLastdo
  548. begin
  549. Temp:=abc[i];
  550. j:=i;
  551. whileTemp<abc[j-1]do
  552. begin
  553. abc[j]:=abc[j-1];
  554. dec(j);
  555. end;
  556. abc[j]:=Temp;
  557. end;
  558. end;
  559. procedureQS(varabc:arrayofInteger;aFirst:Integer;aLast:Integer);
  560. var
  561. L,R:Integer;
  562. Pivot:Integer;
  563. Temp:Integer;
  564. Stack:array[0..63]ofInteger;{allowsfor2billionitems}
  565. SP:Integer;
  566. begin
  567. Stack[0]:=aFirst;
  568. Stack[1]:=aLast;
  569. SP:=2;
  570. while(SP<>0)do
  571. begin
  572. dec(SP,2);
  573. aFirst:=Stack[SP];
  574. aLast:=Stack[SP+1];
  575. while((aLast-aFirst)>QSCutOff)do
  576. begin
  577. R:=(aFirst+aLast)div2;
  578. if(abc[aFirst]>abc[R])then
  579. begin
  580. Temp:=abc[aFirst];
  581. abc[aFirst]:=abc[R];
  582. abc[R]:=Temp;
  583. end;
  584. if(abc[aFirst]>abc[aLast])then
  585. begin
  586. Temp:=abc[aFirst];
  587. abc[aFirst]:=abc[aLast];
  588. abc[aLast]:=Temp;
  589. end;
  590. if(abc[R]>abc[aLast])then
  591. begin
  592. Temp:=abc[R];
  593. abc[R]:=abc[aLast];
  594. abc[aLast]:=Temp;
  595. end;
  596. Pivot:=abc[R];
  597. L:=aFirst;
  598. R:=aLast;
  599. whiletruedo
  600. begin
  601. repeat
  602. dec(R);
  603. until(abc[R]<=Pivot);
  604. repeat
  605. inc(L);
  606. until(abc[L]>=Pivot);
  607. if(L>=R)then
  608. Break;
  609. Temp:=abc[L];
  610. abc[L]:=abc[R];
  611. abc[R]:=Temp;
  612. end;
  613. if(R-aFirst)<(aLast-R)then
  614. begin
  615. Stack[SP]:=succ(R);
  616. Stack[SP+1]:=aLast;
  617. inc(SP,2);
  618. aLast:=R;
  619. end
  620. else
  621. begin
  622. Stack[SP]:=aFirst;
  623. Stack[SP+1]:=R;
  624. inc(SP,2);
  625. aFirst:=succ(R);
  626. end;
  627. end;
  628. end;
  629. end;
  630. begin
  631. QS(abc,0,High(abc));
  632. QSInsertionSort(abc,0,High(abc));
  633. end;
  634. //堆排序
  635. procedureHeapSort(varabc:arrayofInteger);
  636. procedureHSTrickleDown(varabc:arrayofInteger;root,count:Integer);
  637. var
  638. KKK:Integer;
  639. begin
  640. abc[0]:=abc[root];
  641. KKK:=2*root;
  642. whileKKK<=countdo
  643. begin
  644. if(KKK<count)and(abc[KKK]<abc[KKK+1])then
  645. inc(KKK);
  646. ifabc[0]<abc[KKK]then
  647. begin
  648. abc[root]:=abc[KKK];
  649. root:=KKK;
  650. KKK:=2*root;
  651. end
  652. else
  653. KKK:=count+1;
  654. end;
  655. abc[root]:=abc[0];
  656. end;
  657. var
  658. Inx:Integer;
  659. ItemCount:Integer;
  660. tmp:Integer;
  661. begin
  662. ItemCount:=High(abc)-Low(abc)+1;
  663. forInx:=ItemCountdiv2downto1do
  664. begin
  665. HSTrickleDown(abc,Inx,ItemCount);
  666. end;
  667. forInx:=ItemCountdownto2do
  668. begin
  669. tmp:=abc[1];
  670. abc[1]:=abc[Inx];
  671. abc[Inx]:=tmp;
  672. HSTrickleDown(abc,1,Inx-1);
  673. end;
  674. end;
  675. end.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics