数组每N个元素分组排序算法需求及适配疑问
数组按每N个元素分组排序的通用实现
你的核心需求是把数组拆成连续的、长度为N的子数组,每组单独排序后再拼接回原数组。你当前的代码是硬编码了N=3的局部冒泡逻辑,只能处理固定N的情况,要适配任意N,得把“处理子数组”的逻辑抽象出来,而非写死判断条件。
通用实现思路
不用自己硬写排序逻辑,直接利用语言内置的排序函数(比如C++的std::sort),只需控制好每个子数组的起始和结束位置:
- 遍历数组,每次步进N个元素,确定当前子数组的起始索引
start = i - 子数组的结束索引为
end = i + N(注意C++的sort是左闭右开区间) - 对
[start, end)区间的元素排序即可
代码示例(C++)
#include <algorithm> #include <vector> void sortEveryNElements(std::vector<long long>& A1, int N) { int n = A1.size(); // 遍历每个子数组的起始位置,步长为N for (int i = 0; i < n; i += N) { // 对从i到i+N的子数组排序 std::sort(A1.begin() + i, A1.begin() + i + N); } }
如果不想用标准库,要自己实现排序逻辑(比如替换你原来的冒泡),可以把排序逻辑封装成函数,接收子数组的起始和结束索引:
#include <vector> #include <algorithm> // 用于swap // 对数组的[start, end)区间进行冒泡排序 void bubbleSortSubarray(std::vector<long long>& arr, int start, int end) { for (int i = start; i < end - 1; ++i) { for (int j = start; j < end - (i - start) - 1; ++j) { if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); } } } } void sortEveryNElements(std::vector<long long>& A1, int N) { int n = A1.size(); for (int i = 0; i < n; i += N) { bubbleSortSubarray(A1, i, i + N); } }
原代码无法适配大N的原因
你原来的代码只写了针对3个元素的两次交换,这只是冒泡排序的一轮,甚至不能完成3个元素的完整排序(比如初始数组是8,7,6,你的代码第一次交换成7,8,6,第二次交换成7,6,8,还需要再比较一次7和6才能得到正确排序结果)。而且所有索引判断都是硬编码i+1、i+2,一旦N变化,这些位置就不再适用。
用上面的通用方法,不管N是3、5还是其他值,只要数组长度是N的整数倍,都能正确完成分组排序。
内容的提问来源于stack exchange,提问作者psaraj12
相关产品推荐
相关产品推荐

