Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32943
  • 博文数量: 14
  • 博客积分: 255
  • 博客等级: 二等列兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-30 13:47
文章分类
文章存档

2011年(14)

我的朋友

分类: C/C++

2011-10-09 17:50:52

  1. /*
  2. 《快速排序算法》
  3. 算法原理:
  4. 1、从要排序的数组元素中随意找一个元素作为一个"基准"(pivot)
  5. 2、如果当前数组的左边界和右边界重叠--返回
  6. 否则从后往前找小于这个基准的元素x--找到后等待3的完成
  7. ---找不到执行6
  8. 3、从前往后找大于这个基准的元素y
  9. 4、待3执行完后,把x和y交换一下
  10. 5、转到2
  11. 6、对左半边进行快排--此时应注意右边界
  12. 7、对右半边进行快排--此时应注意左边界
  13. 算法实现:
  14. quicksort(int* a, int Low, int High){
  15. 检查左边界右边界是否重叠
  16. 用(当前区域的)第一个元素当“基准”
  17. 从右至左遍历元素,找一个小于基准的元素
  18. 在上边的遍历里(*),从左至右找大于等于基准的元素
  19. 找到就交换
  20. 交换完毕退出内层循环
  21. 对左半边快排
  22. 对右半边快排
  23. }

  24. */
  25. #include
  26. void show(int *a){
  27. int i(0);
  28. for(; i < 15; ++i){
  29. printf("%4d", a[i]);
  30. }
  31. printf("\n");
  32. }
  33. bool check(int *a, int H){
  34. for(int i = 1; i < H; ++i){
  35. if(a[i] < a[i-1])
  36. return false;
  37. }
  38. return true;
  39. }
  40. void quicksort(int *a, int L, int H){
  41. if(L >= H-1){//H-1才是右边界元素的下标
  42. return;
  43. }
  44. int key = a[L];
  45. int j = L;
  46. int i = H-1;
  47. for(; i > j; --i){
  48. if(a[i] >= key){
  49. continue;
  50. }
  51. for(; j < i; ++j){
  52. if(a[j] < key){
  53. continue;
  54. }
  55. int Tmp = a[i];
  56. a[i] = a[j];
  57. a[j] = Tmp;
  58. break;
  59. }
  60. }

  61. quicksort(a, L, j+1);//j是左半边的右边界,H的表示方式从1开始
  62. quicksort(a, i+1, H);//i跟j重叠过,需要+1表示右半边的左边界

  63. }

  64. int main()
  65. {
  66. int a[15] = {12,43,32,28,3,94,8,15,42,42,75,65,21,40,24};
  67. int i = 0;
  68. show(a);

  69. quicksort(a, 0, 15);
  70. show(a);

  71. if(check(a, 15))
  72. printf("SUCCESS!\n");
  73. else
  74. printf("FAILURE!\n");

  75. getchar();
  76. return 0;
  77. }
阅读(510) | 评论(0) | 转发(0) |
0

上一篇:本博声明

下一篇:C 内存对齐

给主人留下些什么吧!~~