aboutsummaryrefslogtreecommitdiff
path: root/tests/sysy_lvX/059_sort_test7.sy
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.001@gmail.com>2026-09-15 08:16:43 +0800
committerRichard Qin <richard.qin.001@gmail.com>2026-09-15 08:16:43 +0800
commit4022e5c95210631e4aceb08eaf9d9071aa5aefc4 (patch)
treea5922559836e45fb3459a3d070367912e1035b1a /tests/sysy_lvX/059_sort_test7.sy
downloadrcc-master.tar.gz
rcc-master.tar.xz
Set up a git repoHEADmaster
Diffstat (limited to 'tests/sysy_lvX/059_sort_test7.sy')
-rw-r--r--tests/sysy_lvX/059_sort_test7.sy47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/sysy_lvX/059_sort_test7.sy b/tests/sysy_lvX/059_sort_test7.sy
new file mode 100644
index 0000000..50561d3
--- /dev/null
+++ b/tests/sysy_lvX/059_sort_test7.sy
@@ -0,0 +1,47 @@
+int buf[2][100];
+
+// sort [l, r)
+void merge_sort(int l, int r)
+{
+ if (l + 1 >= r)
+ return;
+
+ int mid = (l + r) / 2;
+ merge_sort(l, mid);
+ merge_sort(mid, r);
+
+ int i = l, j = mid, k = l;
+ while (i < mid && j < r) {
+ if (buf[0][i] < buf[0][j]) {
+ buf[1][k] = buf[0][i];
+ i = i + 1;
+ } else {
+ buf[1][k] = buf[0][j];
+ j = j + 1;
+ }
+ k = k + 1;
+ }
+ while (i < mid) {
+ buf[1][k] = buf[0][i];
+ i = i + 1;
+ k = k + 1;
+ }
+ while (j < r) {
+ buf[1][k] = buf[0][j];
+ j = j + 1;
+ k = k + 1;
+ }
+
+ while (l < r) {
+ buf[0][l] = buf[1][l];
+ l = l + 1;
+ }
+}
+
+int main()
+{
+ int n = getarray(buf[0]);
+ merge_sort(0, n);
+ putarray(n, buf[0]);
+ return 0;
+}