#include <bits/stdc++.h> using namespace std; string str[100]; string TR1[100]; string TR2[100]; int n; //打印 void show(string a[]) { int i; for (i = 1; i <= n; i++) { cout << a[i]; if (i < n) cout << ' '; else cout << endl; } } //链接 void Merge(string s2[], string s1[], int low, int mid, int high) { int j, k, i; for (j = mid + 1, k = low, i = low; i <= mid && j <= high; k++) { if (s2[i] > s2[j]) s1[k] = s2[i++]; else s1[k] = s2[j++]; } while (i <= mid) s1[k++] = s2[i++]; while (j <= high) s1[k++] = s2[j++]; } //分块 void MPass(string input[], string output[], int Leng) { int i = 1; while (i + 2 * Leng - 1 <= n) { Merge(input, output, i, i + Leng - 1, i + 2 * Leng - 1); i += 2 * Leng; } if ((i + Leng - 1) < n) Merge(input, output, i, i + Leng - 1, n); else { for (int j = i; j <= n; j++) output[j] = input[j]; } } //分块排序 void Merge_Sort() { int Len = 1; while (Len <= n) { MPass(TR2, TR1, Len); show(TR1); Len *= 2; if (Len <= n) { MPass(TR1, TR2, Len); show(TR2); Len *= 2; } } } //主函数 int main() { int t; cin >> t; while (t--) { int i; cin >> n; for (i = 1; i <= n; i++) { cin >> str[i]; TR1[i] = str[i]; TR2[i] = str[i]; } Merge_Sort(); cout << endl; } }分函数详细阐述这段代码的运行原理
时间: 2024-03-26 07:37:19 浏览: 56
这段代码实现了归并排序中的分块排序算法。主要的函数包括:
1. `show(string a[])`:将字符串数组 a 中的元素按顺序输出到屏幕上,每个元素之间以空格分隔,最后一个元素后面没有空格。
2. `Merge(string s2[], string s1[], int low, int mid, int high)`:将两个已经按照字典序从小到大排序好的字符串数组 s2 的两个子数组 s2[low:mid] 和 s2[mid+1:high] 合并成一个有序的数组 s1[low:high],其中 low、mid 和 high 分别是数组下标。
3. `MPass(string input[], string output[], int Leng)`:将字符串数组 input 按照长度为 Leng 的块进行分割,并对每个块进行归并排序,最后将排序好的结果存储到字符串数组 output 中。
4. `Merge_Sort()`:调用 MPass 函数进行分块排序,直到整个数组排序完成。
在主函数中,先输入测试数据的组数 t,然后对于每组测试数据,先输入字符串的个数 n,再逐个输入这 n 个字符串,然后将这些字符串先复制到两个字符串数组 TR1 和 TR2 中,再调用 Merge_Sort 函数进行分块排序,最后输出一个空行以分隔不同的测试数据。
具体地,Merge_Sort 函数中的 while 循环用来控制每一轮的分块排序,变量 Len 代表当前块的长度。在每一轮中,先调用 MPass 函数进行一次从 TR2 到 TR1 的排序,并将排序好的结果输出到屏幕上;然后再检查当前块的长度是否需要再次扩大一倍,如果需要,则再次调用 MPass 函数进行一次从 TR1 到 TR2 的排序,并将排序好的结果输出到屏幕上。这样一直进行下去,直到整个数组排序完成。
在 MPass 函数中,变量 i 用来控制当前块的起始下标,变量 Leng 表示块的长度。在每一个块中,调用 Merge 函数将两个子数组合并成一个有序的数组,存储到字符串数组 output 中。最后,如果当前块的长度不足 Leng,就将剩余的元素直接复制到 output 数组中。
总的来说,这段代码实现了一种高效的分块排序算法,可以用来对字符串数组进行排序。
阅读全文