例如:
输入:arr [] = {1、32、5、6、9、3}和k = 2
子数组将包含元素 {132},{56},{93}。
现在将这些子数组排序为{56},{93},{132}。将这些子数组合并在一起,并按排序顺序显示为原始数组的元素
最终输出:arr [] = {5,6,9,9,3,1,32}
答案 0 :(得分:3)
void SortByGroup(vector<int>& v, int k)
{
int n = v.size();
int index;
string str = " ";
vector<pair<int, int> > arr;
for (int i = 0; i < n; i = i + k)
{
str = " ";
for (int j = i ; j < i+ k ; j++)
{
str += to_string(v[j]); //convert k number into string
}
arr.push_back(make_pair(atoi(str.c_str()), i)); //push string into other vector
}
sort(arr.begin(), arr.end()); // Sorting of array
vector<int> res;
for (int i = 0; i < (n / k); i++) {
int index = arr[i].second; //starting index of contcanate string , run k time from index to get actual no
for (int j = 0; j < k; ++j)
{
res.push_back(v[index++]);
}
}
for (int i = 0; i < n; i++) {
cout << res[i] << " ";
}
}
int main()
{
int k =2;
vector<int> vec{ 1, 32, 5, 6, 9, 3 };
SortByGroup(vec,k);
return 0;
}
答案 1 :(得分:0)
首先将数组划分为(n + k-1)/ k段,然后将值插入向量。 将每个段的值转换为字符串,然后创建用户定义类似结构的数据类型,该数据类型包含字符串,字符串长度和段的原始索引。根据字典顺序按字符串长度对结构进行排序。 现在,您已经对结构进行了排序,并根据结构逐个打印段。
代码实现
#include<bits/stdc++.h>
using namespace std;
struct con
{
string str;
int len;
int ind;
};
bool comp(con a,con b)
{
if(a.len<=b.len)
{
if(a.len==b.len)
return a.str<b.str;
return true;
}
//return true;
return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
cin>>arr[i];
int k;
cin>>k;
int s=n/k;
if(n%k!=0)
s=s+1;
vector<int>b[s];
int m=-1;
for(int i=0;i<n;i++)
{
if(i%k==0)
m++;
b[m].push_back(arr[i]);
}
con st[s];
for(int i=0;i<s;i++)
{
string str="";
for(int j=0;j<b[i].size();j++)
{
str+=to_string(b[i][j]);
}
st[i].str=str;
st[i].len=str.length();
st[i].ind=i;
}
sort(st,st+s,comp);
for(int i=0;i<s;i++)
{
m=st[i].ind;
for(int j=0;j<b[m].size();j++)
cout<<b[m][j]<<" ";
}
cout<<endl;
}
}