Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2150784
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-07-25 12:10:25

1. 快速排序
中间partition的过程就是一个swap的过程,
保存key
右/左->左/右           -->整个过程是一个swap,但这儿是个单向的赋值
key->左/右

第1趟按arr[0],分成左右两部分
左部分与右部分再按上述过程递归

1.2 代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)
  4. #define SWAP(x,y) (x=(x)+(y),y=(x)-(y),x=(x)-(y))

  5. int dump_arry(int* arr, int len)
  6. {
  7.     int i;
  8.     for(i=0; i<len; i++)
  9.     {
  10.         //printf("%d=%d ", i, arr[i]);
  11.         printf("%d ", arr[i]);
  12.     }
  13.     printf("\n");
  14.     return 0;
  15. }

  16. int partition(int* arr, int low, int high)
  17. {
  18.     int i, j;
  19.     int pivotkey;
  20.     if(low >= high)
  21.         return 0;
  22.     pivotkey = arr[low];    //以第一个数据为基准分为左小右大的两部分
  23.     while(low < high)
  24.     {
  25.         while( (low<high) && (arr[high]>=pivotkey) )
  26.             high--;
  27.         arr[low] = arr[high];
  28.         dump_arry(arr, 10);

  29.         while( (low<high) && (arr[low]<=pivotkey) )
  30.             low++;
  31.         arr[high] = arr[low];
  32.         dump_arry(arr, 10);
  33.     }
  34.     arr[low] = pivotkey;
  35.     dump_arry(arr, 10);
  36.     return low;
  37. }

  38. int quick_sort(int* arr, int low, int high)
  39. {
  40.     int pivotloc = partition(arr, low, high);
  41.     dbmsg("pivotloc=%d", pivotloc);
  42.     if(low < high)   //以第一个数据为基准分为左小右大的两部分,这样一直分一直分,直到low
  43.     {
  44.         dbmsg("left");
  45.         quick_sort(arr, low, pivotloc-1);
  46.         dbmsg("right");
  47.         quick_sort(arr, pivotloc+1, high);
  48.     }
  49.     return 0;
  50. }
  51. int main ( int argc, char *argv[] )
  52. {
  53.     //int arr[] = {49, 38, 65, 97, 76, 13, 27, 49};
  54.     int arr[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
  55.     int len = sizeof(arr)/sizeof(int);
  56.     dbmsg("len=%d", len);
  57.     dbmsg("before quick:");
  58.     dump_arry(arr, len);
  59.     quick_sort(arr, 0, len-1);
  60.     dbmsg("after quick:");
  61.     dump_arry(arr, len);
  62.     return EXIT_SUCCESS;
  63. }
1.3 运行结果
  1. quick.c:main[52]: before quick:
  2. 49 38 65 97 76 13 27 49 55 4

  3. 4 38 65 97 76 13 27 49 55 4
  4. 4 38 65 97 76 13 27 49 55 65
  5. 4 38 27 97 76 13 27 49 55 65
  6. 4 38 27 97 76 13 97 49 55 65
  7. 4 38 27 13 76 13 97 49 55 65
  8. 4 38 27 13 76 76 97 49 55 65
  9. 4 38 27 13 76 76 97 49 55 65
  10. 4 38 27 13 76 76 97 49 55 65
  11. 4 38 27 13 49 76 97 49 55 65    -->按49分成左右两部分
  12. 4 38 27 13 49 76 97 49 55 65    -->49的left再4分成左右两部分
  13. 4 13 27 13 49 76 97 49 55 65
  14. 4 13 27 13 49 76 97 49 55 65
  15. 4 13 27 38 49 76 97 49 55 65
  16. 4 13 27 38 49 76 97 49 55 65
  17. 4 13 27 38 49 65 97 49 55 65
  18. 4 13 27 38 49 65 97 49 55 97
  19. 4 13 27 38 49 65 55 49 55 97
  20. 4 13 27 38 49 65 55 49 55 97
  21. 4 13 27 38 49 49 55 49 76 97
  22. 4 13 27 38 49 49 55 49 76 97
  23. 4 13 27 38 49 49 55 65 76 97
  24. 4 13 27 38 49 49 55 65 76 97

  25. quick.c:main[55]: after quick:
  26. 4 13 27 38 49 49 55 65 76 97
1.4 性能
O(nlogn)
1.5 代码打包
quick.rar  (下载后改名为quick.tar.gz)
阅读(1174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~