免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7150 | 回复: 2
打印 上一主题 下一主题

[算法] C语言递归快速排序算法实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-23 15:51 |只看该作者 |倒序浏览
递归函数quicksort里面没有判断左右范围大小,导致无穷递归,纠结了半天。闲来没事,写简单的数据结构,学学编程。
  1. #include <stdio.h>

  2. int quichsort(int *arr, int left, int right);
  3. void swap(int *a, int *b);

  4. int
  5. main()
  6. {
  7.   int arr[] = {9, 2, 1, 4, 3, 15, 11, 6, 7};
  8.   int arr_len = sizeof(arr) / sizeof(arr[0]);
  9.   int i;
  10.   for (i = 0; i < arr_len; i++) {
  11.     printf("%d ", arr[i]);
  12.   }
  13.   printf("\n");
  14.   quicksort(arr, 0, arr_len - 1);
  15.   for (i = 0; i < arr_len; i++)
  16.     printf("%d ", arr[i]);
  17.   printf("\n");

  18.   return 0;
  19. }

  20. int
  21. quicksort(int *arr, int left, int right)
  22. {
  23.   int i = left;
  24.   int j = right;
  25.   int one_key = arr[left];
  26.   if (i >= j) //avoid infinity recursion
  27.     return 0;
  28.   while (i != j) {
  29.   //accomplish one quicksort
  30.     while (arr[j] > one_key) {
  31.       j--;
  32.     }
  33.     swap(&arr[j], &one_key);
  34.     while (arr[i] < one_key) {
  35.       i++;
  36.     }
  37.     swap(&arr[i], &one_key);
  38.   }
  39.   quicksort(arr, left, i - 1); //accomplish the left remaining quicksort
  40.   quicksort(arr, j + 1, right); //accomplish the right remaining quicksort
  41. }

  42. void
  43. swap(int *a, int *b)
  44. {
  45.   int tmp;
  46.   tmp = *a;
  47.   *a = *b;
  48.   *b = tmp;
  49. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-10-23 16:58 |只看该作者
交换有问题
1、在循环内,应该是i,j位置上的值进行交换
2、在循环外,交换i和标志位上的值
  1. int partition(Item a[], int l, int r)
  2. {
  3.     int i = l - 1;
  4.     int j = r;
  5.     Item v = a[r];

  6.     for (; ;) {
  7.         while (less(a[++i], v)) ;
  8.         while (less(v, a[--j]) if (j == l) break;
  9.         if (j <= i) break;
  10.         exch(a[i], a[j]);
  11.     }
  12.     exch(a[i], a[r]);

  13.     return i;
  14. }

  15. void quicksort(Item a[], int l, int r)
  16. {
  17.     int i;

  18.     if (l >= r) return;
  19.     i = partition(a, l, r);
  20.     quicksort(a, l, i - 1);
  21.     quicksort(a, i + 1, r);
  22. }
复制代码
{:3_189:}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-23 17:46 |只看该作者
看算法导论吧, 这种快排实现过时了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP