快速排序的三种写法的效率比较

分类: C++ C语言 数据结构 2012-09-02 20:26 459人阅读 评论(0) 收藏 举报

数据结构算法null

最近在复习排序和查找算法的时候,回想算法课程和数据结构课程上面各种写法,总结一下,顺便比较了一下它们之间的效率,

另《外数据结构》书本上阐述,如果比较的枢纽值不是第一个或者最后一个而是 a[low] ,a[high],a[(high+low)/2] 的中间值,效率还会好很多,但是我在实现的过程中,总是搬移到了错误的位置,没有实现

[cpp] view plaincopy

  1. #include <iostream.h>
  2. #include <windows.h>
  3. #include <ctime>
  4. #include <math.h>
  5. #include <cstdlib>
  6. #include <stdio.h>
  7. void QuickSort( int a[],int low,int high);  //比较经典的一种,将往中间扫面时找到的满足条件的交换
  8. void QuickSort3( int a[],int low,int high); //枢纽暂存,每次找到一个比枢纽大或者小的,就放到上一次搬离的位置,最后把枢纽放回到low处(低地址必须小于高地址,不能等于)
  9. void QuickSort2( int a[],int low,int high);    //只有一个while,指针都从头部开始,,快指针每次都向后移动,遇到一个比枢纽大的就和慢指针交换值
  10. //产生随机数
  11. int randArr(int * pint , int size);
  12. int size = 0;
  13. int main()
  14. {
  15. int a[] ={4,-2,3,19,0,-4,99,7,2,-5,0,-11,2,2,56,-8,0,17,200,5,1,3,5,4,6,-5,29,-1,8};
  16. int b[] ={ 34,51,38,65,119,76,16,27};
  17. //int b[] ={76, 119 };
  18. int tsize=150000;
  19. int *pint = new int[tsize];
  20. int *pint2 = new int[tsize];
  21. int *pint3 = new int[tsize];
  22. int id = 5;
  23. if(! randArr(pint,tsize) )
  24. return 0;
  25. //   memcpy(pint ,a,sizeof(int) * tsize);
  26. memcpy(pint2,pint,sizeof(int) * tsize);
  27. memcpy(pint3,pint,sizeof(int) * tsize);
  28. size = tsize;
  29. printf("=====before====\n");
  30. for(id = 0 ; id< 10;id++)
  31. {
  32. printf("%3d ", pint[id]);
  33. }printf("=====before====\n");
  34. int start  = GetTickCount();
  35. QuickSort(pint,0,size -1);
  36. cout<<"time QuickSort used="<< GetTickCount() - start << endl;
  37. for(id = 0 ; id< 10;id++)
  38. {
  39. printf("%3d ", pint[id]);
  40. }printf("======QuickSort===\n\n");
  41. start  = GetTickCount();
  42. QuickSort2(pint2,0,size -1);
  43. cout<<"time QuickSort2 used="<< GetTickCount() - start << endl;
  44. for(id = 0 ; id< 10;id++)
  45. {
  46. printf("%3d ", pint2[id]);
  47. }printf("======QuickSort2===\n\n");
  48. QuickSort3(pint3,0,size -1);
  49. cout<<"time QuickSort3 used="<< GetTickCount() - start << endl;
  50. for(id = 0 ; id< tsize;id++)
  51. {
  52. if(pint[id] != pint2[id])
  53. {
  54. printf("Confliction!! %d",id);
  55. break;
  56. }
  57. }printf("======QuickSort3===\n\n");
  58. return 0;
  59. }
  60. void QuickSort(int a[],int l,int h)
  61. {
  62. int po;
  63. int high = h , low = l;
  64. if(low < high )
  65. {
  66. po = a[l];
  67. low++;
  68. while(1)
  69. {
  70. while(low <=  high && a[high] >= po) high--;
  71. while(low <=  high && a[low] <= po) low++;
  72. if(low < high)
  73. {
  74. a[low] ^= a[high];
  75. a[high] ^= a[low];
  76. a[low] ^= a[high];
  77. low++;
  78. high--;
  79. }
  80. else
  81. break;
  82. }
  83. a[l] =   a[high];
  84. a[high]  = po;
  85. QuickSort(a,l,high-1);
  86. QuickSort(a,high+1,h);
  87. }
  88. }
  89. void QuickSort2(int a[],int l ,int h)
  90. {
  91. int po;
  92. int high = h,low = l;
  93. if( l < h )
  94. {
  95. po = a[l];
  96. while( low < high)
  97. {
  98. while( low < high && a[high] >= po ) high--;
  99. a[low] = a[high];
  100. while( low < high && a[low] <= po ) low++;
  101. a[high] = a[low];
  102. }
  103. a[low] = po;
  104. QuickSort2(a,l,low-1);
  105. QuickSort2(a,low+1,h);
  106. }
  107. }
  108. void QuickSort3(int a[],int l ,int h )
  109. {
  110. int high  = l+1, low = l+1;
  111. int po = a[l];
  112. if( l < h)
  113. {
  114. while( high <= h)
  115. {
  116. if( a[high] < po)    //找到慢指针
  117. {
  118. if(high != low)
  119. {
  120. a[low] ^=a[high];
  121. a[high] ^=a[low];
  122. a[low] ^=a[high];
  123. }
  124. low++;
  125. }
  126. high++;
  127. }
  128. if(low-1 != l)
  129. {
  130. a[low-1] ^=a[l];
  131. a[l] ^=a[low-1];
  132. a[low-1] ^=a[l];
  133. }
  134. low--;
  135. QuickSort3(a,l,low - 1);
  136. QuickSort3(a,low+1 ,h);
  137. }
  138. }
  139. int randArr(int * pint , int size)
  140. {
  141. int i = 0;
  142. if(!pint)   return 0;
  143. srand((unsigned int)time(NULL));
  144. for( i = 0 ; i<size; i++)
  145. {
  146. pint[i] = rand() % 100 ;
  147. if( rand() % 10 == 1 && rand() % 10 == 1 && rand() % 10 == 1 &&pint[i] % 10 == 2)
  148. pint[i] *= -1;
  149. }
  150. return 1;
  151. }
时间: 2024-10-13 10:22:31

快速排序的三种写法的效率比较的相关文章

同一个逻辑的三种写法

同一个逻辑的三种写法: 我的写法 ? 林姐的写法 方法一 方法二 这种方法节省内存

HDU Today(三种写法)(最短路)

Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市?浦镇陶姚村买了个房子,开始安度晚年了. 这样住了一段时间,徐总对当地的交通还是不太了解.有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格). 徐总经常会问蹩脚的英文问路:"Can you h

js中斐波拉切数的三种写法;

js中斐波拉切数的三种写法: function factorial(num){ if(num <=1){ return 1; }else{ return num* factorial(num-1); } } console.log(factorial(5));//120 面这个函数的执行与函数名紧紧耦合在了一起,可以使用arguments.callee可以消除函数解耦 第二种(在严格模式下,访问这个属性会抛出TypeError错误) function factorial(num){ if(num

鼠标移到图片变化的三种写法(可移植性强、代码少)

当鼠标移动到某个图片的时候,图片变化.当鼠标移出去的时候,图片变回来.下面是三种写法:第一种,也是最笨,最麻烦的写法,如下: 1 $(".web-footer2 .inner").each(function(){ 2 $(this).find("ul").eq(1).find("img").eq(0).hover(function(){ 3 $(this).attr("src","/img/footer-qq2.pn

布局填充器的三种写法

布局填充器的三种写法:  1.layoutInflater=layoutInflater.from(this);  2.layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);  3.layoutInflater=this.getLayoutInflater();

总结 React 组件的三种写法 及最佳实践

React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普及和不同业务场景的影响,我们会发现目前主要有三种创建 React 组件的写法:1. ES5写法React.createClass,2. ES6写法React.Component,3. 无状态的函数式写法(纯组件-SFC). 你们最钟爱哪种写法呢?萝卜青菜各有所爱~ 每个团队都有自己的代码规范和开发模

清空StringBuilder的三种方法及效率

清空StringBuilder的三种方法及效率 大家知道对于字符串频繁拼接是使用stringbuilder.Append方法比使用string+=方法效率高很多,但有时需要清空stringbuilder时却不知道怎么清空,因为它没有clear或empty的方法.那用什么方法呢?在网上搜了一下大概一下三种方法. 1.Remove 例: StringBuilder val = new StringBuilder(); val.Append("...."); val.Remove(0,val

setInterval()的三种写法

前言: setInterval("fun()",time)有两个参数:fun()为要执行的函数:time为多久执行一次函数,单位是毫秒: 我们做一个简单的例子,就是每隔5s弹出一个“hello”的对话框. 先看第一种写法,把方法体抽离出来,以字符串的形式调用函数名,这种写法调用函数名是不能传参的: <script type="text/javascript"> setInterval("hello()",5000); function

jquery 在页面中三种写法

jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于 2.x 不再兼容 IE6.7.8浏览器,这样做的目的是为了兼容移动端开发.由于减少了一些代码,使得该版本比 jQuery 1.x 更小.更快.如果开发者比较在意老版本 IE 用户,只能使用 jQuery 1.9 及之前的版本了.jQuery是一个JavaScript脚本库,不需要特别的安装,只需要我们在页面 <head> 标签内中,通过 script 标签引入 jQuery 库即可. 1 <script type=&q