7-2 非递归二路归并排序
本题目要求读入N个整数,采用非递归的二路归并排序法进行排序,输出前3轮排序后的结果。
输入格式:
输入不超过100的正整数N和N个整数(空格分隔)。
输出格式:
输出三行,第一行为第一轮排序结果,第二行为第二轮排序结果,第三行为第三轮排序结果。数据间用一个空格分隔。
为简便起见,最后一个元素后也有一个空格。
输入样例:
5
3 2 8 1 7
输出样例:
2 3 1 8 7
1 2 3 8 7
1 2 3 7 8
简化版代码
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int w[] = {2, 4, 8};
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < n; j += w[i]) {
sort(a + j, a + min(j + w[i], n));
}
for (int j = 0;j < n; ++j) {
cout << a[j] << " ";
}
cout << endl;
}
}
注意:代码sort(a + j, a + min(j + w[i], n));
为了方便,直接用的函数,在思想上和时间复杂度是一样的。
中文注释版代码
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int w[] = {2, 4, 8};
// 按照指定的步长进行排序
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < n; j += w[i]) {
// 对每个步长范围内的子数组进行排序
sort(a + j, a + min(j + w[i], n));
}
// 输出当前排序结果
for (int j = 0; j < n; ++j) {
cout << a[j] << " ";
}
cout << endl;
}
return 0;
}
java版代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入数组长度
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = scanner.nextInt();
}
int[] w = {2, 4, 8};
// 按照指定的步长进行排序
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < n; j += w[i]) {
// 对每个步长范围内的子数组进行排序
Arrays.sort(a, j, Math.min(j + w[i], n));
}
// 输出当前排序结果
for (int j = 0; j < n; ++j) {
System.out.print(a[j] + " ");
}
System.out.println();
}
}
}
标签:sort,归并,include,递归,int,二路,++,步长,排序
From: https://www.cnblogs.com/aslwr/p/72-nonrecursive-second-roads-merger-and-sorting-ztv4ei.htm