YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
quicksort_template_2.h
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#define MAX_STACK_SIZE (64)
6
27 YAC_QSORT_ARRAY_TYPE_A * a, size_t n,
29
30 if (n < 2) return;
31
32 /* Initialization */
33
34 struct {
35 size_t l, r;
36 } stack[MAX_STACK_SIZE];
37
38 size_t stack_size = 1;
39 stack[0].l = 0;
40 stack[0].r = n-1;
41
42 /* Start sorting
43
44 ... keep taking the top request from the stack until stack_size = 0.
45
46 */
47
48 while ( stack_size > 0 ) {
49
50 stack_size--;
51 size_t l = stack[stack_size].l;
52 size_t r = stack[stack_size].r;
53
54 /* ... keep splitting a[l], ... ,a[r] until l>= r. */
55
56 while ( l < r ) {
57
58 size_t i = l;
59 size_t j = r;
60 YAC_QSORT_ARRAY_TYPE_A x = a[(l+r+1) / 2];
61
62 do {
63
64 /* Search from lower end */
65 while(a[i] < x) i++;
66
67 /* Search from upper end */
68 while(x < a[j]) j--;
69
70 if (i > j) break;
71
72 /* Swap positions i & j */
73
74 YAC_QSORT_ARRAY_TYPE_A temp_a = a[i];
75 a[i] = a[j];
76 a[j] = temp_a;
77
78 if (b != NULL) {
79 YAC_QSORT_ARRAY_TYPE_B temp_b = b[i];
80 b[i] = b[j];
81 b[j] = temp_b;
82 }
83 if (c != NULL) {
84 YAC_QSORT_ARRAY_TYPE_C temp_c = c[i];
85 c[i] = c[j];
86 c[j] = temp_c;
87 }
88
89 i++;
90 j--;
91
92 } while (i < j);
93
94 if ( j-l >= r-i ) {
95
96 if ( l < j ) {
97
98 stack[stack_size].l = l;
99 stack[stack_size].r = j;
100 stack_size++;
101 }
102
103 l = i;
104
105 } else {
106
107 if ( i < r ) {
108
109 stack[stack_size].l = i;
110 stack[stack_size].r = r;
111 stack_size++;
112 }
113 r = j;
114 }
115 } /* ( l < r ) */
116 } /* ( stack_size /= 0 ) */
117}
118#undef MAX_STACK_SIZE
#define YAC_QSORT_NAME
Definition quicksort.c:12
#define YAC_QSORT_ARRAY_TYPE_B
Definition quicksort.c:115
#define YAC_QSORT_ARRAY_TYPE_C
Definition quicksort.c:116
#define YAC_QSORT_ARRAY_TYPE_A
Definition quicksort.c:114
#define MAX_STACK_SIZE