sort.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:2k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/thread.doc,v 1.11 1997/02/21 19:50:51 drh Exp $";
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include "assert.h"
  6. #include "fmt.h"
  7. #include "thread.h"
  8. #include "mem.h"
  9. struct args {
  10. int *a;
  11. int lb, ub;
  12. };
  13. int cutoff = 10000;
  14. int partition(int a[], int i, int j) {
  15. int v, k, t;
  16. j++;
  17. k = i;
  18. v = a[k];
  19. while (i < j) {
  20. i++; while (a[i] < v && i < j) i++;
  21. j--; while (a[j] > v         ) j--;
  22. if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; }
  23. }
  24. t = a[k]; a[k] = a[j]; a[j] = t;
  25. return j;
  26. }
  27. int quick(void *cl) {
  28. struct args *p = cl;
  29. int lb = p->lb, ub = p->ub;
  30. if (lb < ub) {
  31. int k = partition(p->a, lb, ub);
  32. p->lb = lb;
  33. p->ub = k - 1;
  34. if (k - lb > cutoff) {
  35. Thread_T t;
  36. t = Thread_new(quick, p, sizeof *p, NULL);
  37. Fmt_print("thread %p sorted %d..%dn", t, lb, k - 1);
  38. } else
  39. quick(p);
  40. p->lb = k + 1;
  41. p->ub = ub;
  42. if (ub - k > cutoff) {
  43. Thread_T t;
  44. t = Thread_new(quick, p, sizeof *p, NULL);
  45. Fmt_print("thread %p sorted %d..%dn", t, k + 1, ub);
  46. } else
  47. quick(p);
  48. }
  49. return EXIT_SUCCESS;
  50. }
  51. void sort(int *x, int n, int argc, char *argv[]) {
  52. struct args args;
  53. if (argc >= 3)
  54. cutoff = atoi(argv[2]);
  55. args.a = x;
  56. args.lb = 0;
  57. args.ub = n - 1;
  58. quick(&args);
  59. Thread_join(NULL);
  60. }
  61. main(int argc, char *argv[]) {
  62. int i, n = 100000, *x, preempt;
  63. preempt = Thread_init(1, NULL);
  64. assert(preempt == 1);
  65. if (argc >= 2)
  66. n = atoi(argv[1]);
  67. x = CALLOC(n, sizeof (int));
  68. srand(time(NULL));
  69. for (i = 0; i < n; i++)
  70. x[i] = rand();
  71. sort(x, n, argc, argv);
  72. for (i = 1; i < n; i++)
  73. if (x[i] < x[i-1])
  74. break;
  75. assert(i == n);
  76. Thread_exit(EXIT_SUCCESS);
  77. return EXIT_SUCCESS;
  78. }