内排序方法总结

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef int ElementType;
  4. /*插入排序*/ /*时间复杂度O(N²)*/
  5. void InsertionSort ( ElementType *A, int N )
  6. {
  7. int j, P;
  8. ElementType Tmp;
  9. for( P=1; P<N; P++)
  10. {
  11. Tmp = A[P];
  12. for( j=P; j>0 && A[j-1]>Tmp; j-- )
  13. A[j] = A[j-1];
  14. A[j] = Tmp;
  15. }
  16. }
  17. /*希尔排序*/ ///特殊的插入排序
  18. void Shallsort ( ElementType *A, int N )
  19. {
  20. int i, j, Increment;
  21. ElementType Tmp;
  22. for( Increment=N/2; Increment>0; Increment/=2)
  23. {
  24. for( i=Increment; i<N; i++ )
  25. {
  26. Tmp = A[i];
  27. for( j=i; j>=Increment && Tmp < A[j - Increment]; j-=Increment )
  28. A[j] = A[j - Increment];
  29. A[j] = Tmp;
  30. }
  31. }
  32. }
  33. /*堆排序*/
  34. #define LeftChild( i ) ( 2 * ( i ) + 1 )
  35. void PercDown ( ElementType *A, int i, int N )
  36. {
  37. int Child;
  38. ElementType Tmp;
  39. for( Tmp = A[i]; LeftChild(i) < N; i = Child )
  40. {
  41. Child = LeftChild(i);
  42. if( Child != N-1 && A[Child + 1] > A[Child] )
  43. Child++;
  44. if( Tmp < A[Child] )
  45. A[i] = A[Child];
  46. else break;
  47. }
  48. A[i] = Tmp;
  49. }
  50. void Heapsort( ElementType *A, int N )
  51. {
  52. int i;
  53. for( i = N/2; i >= 0; i-- )
  54. PercDown( A, i, N);
  55. for( i = N-1; i >= 0; i-- )
  56. {
  57. swap( A[0], A[i] );
  58. PercDown( A, 0, i );
  59. }
  60. }
  61. /*快速排序*/
  62. void qusort( int *a, int lt, int rt )
  63. {
  64. if(lt >= rt) return;
  65. int i = lt, j = rt, key = a[lt];
  66. while(i<j)
  67. {
  68. while(i<j && a[j] >= key)
  69. j--;
  70. a[i] = a[j];
  71. while(i<j && a[i] <= key)
  72. i++;
  73. a[j] = a[i];
  74. }
  75. a[i] = key;
  76. qusort( a, lt, i-1 );
  77. qusort( a, i+1, rt );
  78. }
  79. void qsort(void *base, size_t nmemb, size_t size,
  80. int (*compar)(const void*, const void*))
  81. //目标数组, 项数, sizeof(int), 函数指针
  82. int mycomp ( const void *p1, const void *p2 )
  83. {
  84. /*使用指向int类型的指针访问值*/
  85. const int *a1 = (const int *) p1;
  86. const int *a2 = (const int *) p2;
  87. if( *a1 < *a2 ) /*从小到大排序*/
  88. return -1;
  89. else if( *a1 == *a2 )
  90. return 0;
  91. else
  92. return 1;
  93. }
  94. /*归并排序*/
  95. /* Lpos = start of left half, Rpos = start of right half */
  96. void Merge ( ElementType *A, ElementType *TmpArray,
  97. int Lpos, int Rpos, int RightEnd )
  98. {
  99. int i, LeftEnd, NumElements, TmpPos;
  100. LeftEnd = Rpos - 1;
  101. TmpPos = Lpos;
  102. NumElements = RightEnd - Lpos + 1;
  103. /* main loop */
  104. while( Lpos <= LeftEnd && Rpos <= RightEnd )
  105. {
  106. if( A[Lpos] <= A[Rpos] )
  107. TmpArray[TmpPos++] = A[Lpos++]; /* Copy rest of first half */
  108. else
  109. TmpArray[TmpPos++] = A[Rpos++]; /* Copy rest of second half */
  110. }
  111. while( Lpos <= LeftEnd )
  112. TmpArray[TmpPos++] = A[Lpos++];
  113. while( Rpos <= RightEnd )
  114. TmpArray[TmpPos++] = A[Rpos++];
  115. /* Copy TmpArray back */
  116. for( i=0; i<NumElements; i++, RightEnd-- )
  117. A[RightEnd] = TmpArray[RightEnd];
  118. }
  119. void Msort ( ElementType *A, ElementType *TmpArray,
  120. int Left, int Rigth )
  121. {
  122. int Center;
  123. if( Left < Right )
  124. {
  125. Center = ( Left + Right ) / 2;
  126. Msort( A, TmpArray, Left, Center );
  127. Msort( A, TmpArray, Center+1, Right );
  128. Merge( A, TmpArray, Left, Center+1; Right );
  129. }
  130. }
  131. void Mergesort ( ElementType *A, int N )
  132. {
  133. ElementType *TmpArray;
  134. TmpArray = malloc( N * sizeof( ElementType ));
  135. if( !TmpArray )
  136. {
  137. Msort( A, TmpArray, 0, N-1 );
  138. free( TmpArray );
  139. }
  140. else
  141. // FatalError( "No space for tmp array!!!" );
  142. return;
  143. }
  144. /*选择排序*/
  145. //略
  146. /*桶排序*/
  147. //略
  148. /*冒泡排序*/
  149. //略
  150. int main()
  151. {
  152. cout << "Hello world!" << endl;
  153. return 0;
  154. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部