《MY数据结构与算法》----八大排序算法(含优化与算法拓展)

素颜马尾好姑娘i 2022-05-18 11:00 209阅读 0赞

一:八大排序算法比较

20150821162219212

二:八大排序算法代码实现,以及优化与拓展

冒泡排序:优化为增加哨兵。
选择排序:
希尔排序:
插入排序:
归并排序:拓展为应用在求逆序对
快速排序:拓展为求数组中第n大的值。
堆排序: 拓展为求数组中前n个大的值。
归并排序,快速排序,堆排序,的优化方法之一都可以在数组元素个数小于15的时候用插入排序。(代码未添加)
快速排序:可优化为当重复的元素过多的时候选择3路归并(代码未添加)
快速排序:变形可变为不使用递归,而使用栈和队列的方式(代码未添加)
具体我在此博客看到有介绍。可作参考:https://blog.csdn.net/Vichyssoise/article/details/78922138

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #define ARR_MAX_COUNT 10
  4. #define p() cout << "-----------------------------\n";
  5. #define __PRINT_FUNC() cout << __func__ << endl;
  6. using namespace std;
  7. class TEST_SORT_ARR {
  8. private :
  9. int arr[ARR_MAX_COUNT];
  10. int inversion_num;
  11. public :
  12. TEST_SORT_ARR() ;
  13. ~TEST_SORT_ARR() ;
  14. void prn();
  15. void bubbling_sort();
  16. void bubbling_sort_add_sentry_optimize();
  17. void select_sort();
  18. void insert_sort();
  19. void shell_sort();
  20. void merge_sort();
  21. int merge_sort_app_get_inversion();
  22. void quick_sort();
  23. int quick_sort_app_return_value_of_nox(int id);
  24. void heap_sort();
  25. private :
  26. void __shellInsertSort(int arr[] , int n , int dk);
  27. void __merge_sort(int arr[] , int l , int r);
  28. void __merge(int arr[] , int l , int middle ,int r) ;
  29. void __merge_sort_app_inversion_num(int arr[] , int l , int r);
  30. void __merge_app_inversion_num(int arr[] , int l , int middle ,int r) ;
  31. void __quick_sort(int arr[] , int l , int r);
  32. int __quick(int arr[] , int l ,int r);
  33. void __heap_sort(int arr[] , int count);
  34. int __parent(int n);
  35. int __leftchild(int n);
  36. int __rightchild(int n);
  37. void __shift_down(int arr[] , int len , int i);
  38. };
  39. int TEST_SORT_ARR::__parent(int n) {
  40. return (n-1)/2;
  41. }
  42. int TEST_SORT_ARR::__leftchild(int n) {
  43. return 2*n+1;
  44. }
  45. int TEST_SORT_ARR::__rightchild(int n) {
  46. return 2*n+2;
  47. }
  48. void TEST_SORT_ARR::__shift_down(int arr[] , int len , int i) {
  49. int lchild = __leftchild(i);
  50. int rchild = __rightchild(i);
  51. int nmax;
  52. if( lchild < len && arr[lchild] > arr[i] )
  53. nmax = lchild;
  54. else
  55. nmax = i;
  56. if( rchild < len && arr[rchild] > arr[nmax] )
  57. nmax = rchild;
  58. if( nmax != i)
  59. {
  60. swap(arr[i] , arr[nmax]);
  61. __shift_down(arr, len, nmax);
  62. }
  63. }
  64. void TEST_SORT_ARR::__heap_sort(int arr[] , int n) {
  65. for(int i = __parent(n-1) ; i>=0 ; i--)
  66. {
  67. __shift_down(arr,n,i);
  68. }
  69. for(int i = n-1 ; i>0 ; i-- ) {
  70. swap(arr[0] , arr[i] );
  71. n--;
  72. __shift_down(arr,n,0);
  73. }
  74. }
  75. void TEST_SORT_ARR::heap_sort() {
  76. __PRINT_FUNC();
  77. __heap_sort(arr,ARR_MAX_COUNT);
  78. }
  79. int TEST_SORT_ARR::quick_sort_app_return_value_of_nox(int id) {
  80. __PRINT_FUNC();
  81. int middle = __quick(arr, 0 , ARR_MAX_COUNT-1);
  82. while( middle != id) {
  83. if( middle>id) {
  84. middle = __quick(arr,0,middle-1);
  85. }
  86. else {
  87. middle = __quick(arr,middle+1,ARR_MAX_COUNT-1);
  88. }
  89. }
  90. return arr[middle];
  91. }
  92. int TEST_SORT_ARR::__quick(int arr[] , int l , int r) {
  93. if( l>=r )
  94. return l;
  95. swap(arr[l] , arr[ rand()%(r-l+1)+l ]);
  96. int v = arr[l];
  97. int i = l+1;
  98. int j = r;
  99. while( true ) {
  100. while( i<=r && arr[i]<= v) {
  101. i++;
  102. }
  103. while( j>=l+1 && arr[j]>= v) {
  104. j--;
  105. }
  106. if( i>=j)
  107. break;
  108. swap(arr[i] , arr[j]);
  109. i++;
  110. j--;
  111. }
  112. swap(arr[j] , arr[l]);
  113. return j;
  114. }
  115. void TEST_SORT_ARR::__quick_sort(int arr[] , int l , int r) {
  116. if( l>=r )
  117. return ;
  118. int middle = __quick(arr, l , r);
  119. __quick_sort(arr,l,middle-1);
  120. __quick_sort(arr,middle+1 , r);
  121. }
  122. void TEST_SORT_ARR::quick_sort() {
  123. __PRINT_FUNC();
  124. __quick_sort(arr,0,ARR_MAX_COUNT-1);
  125. }
  126. void TEST_SORT_ARR::__merge_app_inversion_num(int arr[] , int l , int middle ,int r) {
  127. int tempArr[r-l+1] ;
  128. for( int i=l ; i<=r ; i++){
  129. tempArr[i-l] = arr[i];
  130. }
  131. int lp = l,lr=middle+1;
  132. for( int i=l ; i<=r ; i++) {
  133. if( lp > middle ) {
  134. arr[i] = tempArr[lr-l];
  135. lr++;
  136. }
  137. else if( lr > r ) {
  138. arr[i] = tempArr[lp-l];
  139. lp++;
  140. }
  141. else if( tempArr[lr-l] <= tempArr[lp-l] ) {
  142. arr[i] = tempArr[lr-l];
  143. inversion_num += (middle-lp+1);
  144. lr++;
  145. }
  146. else {
  147. arr[i] = tempArr[lp-l];
  148. lp++;
  149. }
  150. }
  151. }
  152. void TEST_SORT_ARR::__merge_sort_app_inversion_num(int arr[] , int l , int r) {
  153. if( l>=r)
  154. return ;
  155. int middle = (r-l)/2+l;
  156. __merge_sort_app_inversion_num(arr,l,middle);
  157. __merge_sort_app_inversion_num(arr,middle+1,r);
  158. __merge_app_inversion_num(arr,l,middle,r);
  159. }
  160. int TEST_SORT_ARR::merge_sort_app_get_inversion() {
  161. __PRINT_FUNC();
  162. inversion_num = 0;
  163. __merge_sort_app_inversion_num(arr,0,ARR_MAX_COUNT-1);
  164. return inversion_num;
  165. }
  166. void TEST_SORT_ARR::__merge(int arr[] , int l , int middle ,int r) {
  167. int tempArr[r-l+1] ;
  168. for( int i=l ; i<=r ; i++){
  169. tempArr[i-l] = arr[i];
  170. }
  171. int lp = l,lr=middle+1;
  172. for( int i=l ; i<=r ; i++) {
  173. if( lp > middle ) {
  174. arr[i] = tempArr[lr-l];
  175. lr++;
  176. }
  177. else if( lr > r ) {
  178. arr[i] = tempArr[lp-l];
  179. lp++;
  180. }
  181. else if( tempArr[lr-l] < tempArr[lp-l] ) {
  182. arr[i] = tempArr[lr-l];
  183. lr++;
  184. }
  185. else {
  186. arr[i] = tempArr[lp-l];
  187. lp++;
  188. }
  189. }
  190. }
  191. void TEST_SORT_ARR::__merge_sort(int arr[] , int l , int r) {
  192. if( l>=r)
  193. return ;
  194. int middle = (r-l)/2+l;
  195. __merge_sort(arr,l,middle);
  196. __merge_sort(arr,middle+1,r);
  197. __merge(arr,l,middle,r);
  198. }
  199. void TEST_SORT_ARR::merge_sort() {
  200. __PRINT_FUNC();
  201. __merge_sort(arr,0,ARR_MAX_COUNT-1);
  202. }
  203. void TEST_SORT_ARR::__shellInsertSort(int arr[] , int n , int dk) {
  204. for(int i=dk ; i<ARR_MAX_COUNT ; i+=dk) {
  205. int flag = i-dk;
  206. int val = arr[i];
  207. while( (flag>=0)&&(arr[flag]>val))
  208. {
  209. arr[flag+dk] = arr[flag];
  210. flag -= dk;
  211. }
  212. arr[flag+dk] = val;
  213. }
  214. }
  215. void TEST_SORT_ARR::shell_sort() {
  216. __PRINT_FUNC();
  217. int dk = ARR_MAX_COUNT/2;
  218. while(dk>=1) {
  219. __shellInsertSort(arr,ARR_MAX_COUNT,dk);
  220. dk /= 2;
  221. }
  222. }
  223. void TEST_SORT_ARR::insert_sort() {
  224. __PRINT_FUNC();
  225. for(int i=1; i<ARR_MAX_COUNT ; i++) {
  226. int flag = i-1;
  227. int val = arr[i];
  228. // ba dangqianzhi tichulai baocunwei val;
  229. // ranhou qianmian de meigezhi he val bijiao , bitada,jiu wanghou yidong
  230. while((flag>=0) && (arr[flag]>val))
  231. {
  232. arr[flag+1] = arr[flag];
  233. flag--;
  234. }
  235. //zuihou zai jiang val fuzhi guoqu ;
  236. arr[flag+1] = val;
  237. }
  238. }
  239. void TEST_SORT_ARR::select_sort() {
  240. __PRINT_FUNC();
  241. for(int i=0 ; i<ARR_MAX_COUNT-1 ; i++) {
  242. for(int j=i+1 ; j<ARR_MAX_COUNT ; j++)
  243. {
  244. if(arr[i] > arr[j])
  245. swap(arr[i],arr[j]);
  246. }
  247. }
  248. }
  249. void TEST_SORT_ARR::prn() {
  250. for(int i=0 ; i<ARR_MAX_COUNT ; i++)
  251. cout << arr[i] << " ";
  252. cout << endl;
  253. }
  254. TEST_SORT_ARR::TEST_SORT_ARR() {
  255. for(int i=0 ; i<ARR_MAX_COUNT ; i++) {
  256. arr[i] = rand()%88;
  257. }
  258. }
  259. TEST_SORT_ARR::~TEST_SORT_ARR() {}
  260. void TEST_SORT_ARR::bubbling_sort(){
  261. for(int i=0 ; i<ARR_MAX_COUNT-1; i++) {
  262. for(int j=0 ; j<ARR_MAX_COUNT-1-i ; j++) {
  263. if(arr[j] > arr[j+1])
  264. swap(arr[j],arr[j+1]);
  265. }
  266. }
  267. }
  268. void TEST_SORT_ARR::bubbling_sort_add_sentry_optimize(){
  269. int flag = 0;
  270. for(int i=0 ; i<ARR_MAX_COUNT-1; i++) {
  271. for(int j=0 ; j<ARR_MAX_COUNT-1-i ; j++) {
  272. if(arr[j] > arr[j+1]) {
  273. swap(arr[j],arr[j+1]);
  274. flag = 1;
  275. }
  276. }
  277. if( 1==flag ) {
  278. flag = 0;
  279. }
  280. else {
  281. return ;
  282. }
  283. }
  284. }
  285. int main()
  286. {
  287. TEST_SORT_ARR d;
  288. d.prn();
  289. d.merge_sort();
  290. d.prn();
  291. p();
  292. TEST_SORT_ARR h;
  293. h.prn();
  294. h.heap_sort();
  295. h.prn();
  296. p();
  297. TEST_SORT_ARR f;
  298. f.prn();
  299. f.quick_sort();
  300. f.prn();
  301. p();
  302. TEST_SORT_ARR g;
  303. p();
  304. g.prn();
  305. cout << "no.3 is :" << g.quick_sort_app_return_value_of_nox(3) << endl;
  306. g.prn();
  307. p();
  308. TEST_SORT_ARR e;
  309. e.prn();
  310. cout << "ni xu dui num : " << e.merge_sort_app_get_inversion() <<endl;
  311. e.prn();
  312. p();
  313. TEST_SORT_ARR a;
  314. a.prn();
  315. a.bubbling_sort();
  316. a.prn();
  317. p();
  318. TEST_SORT_ARR c;
  319. c.prn();
  320. c.shell_sort();
  321. c.prn();
  322. p();
  323. TEST_SORT_ARR b;
  324. b.prn();
  325. b.insert_sort();
  326. b.prn();
  327. p();
  328. TEST_SORT_ARR aa;
  329. aa.prn();
  330. aa.bubbling_sort_add_sentry_optimize();
  331. aa.prn();
  332. p();
  333. TEST_SORT_ARR ab;
  334. ab.prn();
  335. ab.select_sort();
  336. ab.prn();
  337. p();
  338. }

发表评论

表情:
评论列表 (有 0 条评论,209人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法排序

    排序是编程的基础,在程序中会经常使用,好的排序方法可以帮助你提高程序运行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来。无论你的技术多么强,如果没有基础也强不到哪去