YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
quicksort_template.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
26 YAC_QSORT_ARRAY_TYPE * a, size_t n, YAC_QSORT_INDEX_TYPE * idx) {
27
28 if (n < 2) return;
29
30 /* Initialization */
31
32 struct {
33 size_t l, r;
34 } stack[MAX_STACK_SIZE];
35
36 size_t stack_size = 1;
37 stack[0].l = 0;
38 stack[0].r = n-1;
39
40 /* Start sorting
41
42 ... keep taking the top request from the stack until stack_size = 0.
43
44 */
45
46 while ( stack_size > 0 ) {
47
48 stack_size--;
49 size_t l = stack[stack_size].l;
50 size_t r = stack[stack_size].r;
51
52 /* ... keep splitting a[l], ... ,a[r] until l>= r. */
53
54 while ( l < r ) {
55
56 size_t i = l;
57 size_t j = r;
58 YAC_QSORT_ARRAY_TYPE x = a[(l+r+1) / 2];
59
60 do {
61
62 /* Search from lower end */
63 while(a[i] < x) i++;
64
65 /* Search from upper end */
66 while(x < a[j]) j--;
67
68 if (i > j) break;
69
70 /* Swap positions i & j */
71
72 YAC_QSORT_ARRAY_TYPE temp_a = a[i];
73 a[i] = a[j];
74 a[j] = temp_a;
75
76 if (idx != NULL) {
77 YAC_QSORT_INDEX_TYPE temp_idx = idx[i];
78 idx[i] = idx[j];
79 idx[j] = temp_idx;
80 }
81
82 i++;
83 j--;
84
85 } while (i < j);
86
87 if ( j-l >= r-i ) {
88
89 if ( l < j ) {
90
91 stack[stack_size].l = l;
92 stack[stack_size].r = j;
93 stack_size++;
94 }
95
96 l = i;
97
98 } else {
99
100 if ( i < r ) {
101
102 stack[stack_size].l = i;
103 stack[stack_size].r = r;
104 stack_size++;
105 }
106
107 r = j;
108 }
109 } /* ( l < r ) */
110 } /* ( stack_size /= 0 ) */
111}
112#undef MAX_STACK_SIZE
#define YAC_QSORT_INDEX_TYPE
Definition quicksort.c:11
#define YAC_QSORT_ARRAY_TYPE
Definition quicksort.c:10
#define YAC_QSORT_NAME
Definition quicksort.c:12
#define MAX_STACK_SIZE