我有两个相同大小的数组。并且希望正常排序其中一个数组,然后相应地对下一个数组元素进行排序。 我们假设我们有两个数组
e[] = {4,2,3,7,6,8}
s[] = {2,0,4,3,7,9}
首先我想正常排序数组e
,然后根据s
更改的元素位置更改e
数组的元素位置。
这应该是最终结果
e[] = {2,3,4,6,7,8}
s[] = {0,4,2,7,3,9}
我该怎么做?我应该使用这两个类对象作为私有成员然后继续吗?如果是这样,怎么做?
答案 0 :(得分:3)
创建单个数组(或vector)std::pair
个对象,其中viewDidLoad
来自第一个数组,first
来自第二个数组。然后只需使用std::sort
和自定义比较器函数,该函数仅使用对中的second
进行比较。迭代排序的数组(或向量)并拆分成原始数组。
注意:如果每个数组中的值紧密耦合,则考虑将它们放在结构或类中,而不是使用两个(或更多)不同的数组。
答案 1 :(得分:1)
std::map
e
元素指定为键s
元素作为值。答案 2 :(得分:0)
如果在类中执行此操作,则可以创建索引数组并根据e []中的值对索引进行排序。如果不在类中执行此操作,并且对于更通用的方法,请创建指向e []的指针数组,然后根据e []对指针进行排序。然后根据指针重新排序e []和s [],使用array_of_pointers [i] - & e [0](或者只是array_of_pointers [i] -e)将排序的指针转换为索引。您可以编写自己的排序,或使用qsort,std :: sort或std :: stable排序对指针数组进行排序,使用比较函数,使用解除引用的指针进行比较(比较指向的值)。示例C代码使用qsort并使用O(n)时间复杂度重新排序逻辑:
int compare(const void *pp0, const void *pp1)
{
int i0 = **(int **)pp0;
int i1 = **(int **)pp1;
if(i0 > i1)return -1;
if(i0 < i1)return 1;
return 0;
}
int main()
{
int e[...];
int s[...];
int *pe[...];
size_t i, j, k;
int te, ts;
/* ... */
/* create array of pointers to e[] */
for(i = 0; i < sizeof(e)/sizeof(e[0]); i++)
pe[i] = &e[i];
/* sort array of pointers */
qsort(pe, sizeof(e)/sizeof(e[0]), sizeof(pe[0]), compare);
/* reorder e[] and s[] according to the array of pointers */
for(i = 0; i < sizeof(e)/sizeof(e[0]); i++){
if(i != pe[i]-e){
te = e[i];
ts = s[i];
k = i;
while(i != (j = pe[k]-e)){
e[k] = e[j];
s[k] = s[j];
pe[k] = &e[k];
k = j;
}
e[k] = te;
s[k] = ts;
pe[k] = &e[k];
}
}
/* ... */
return 0;
}
答案 3 :(得分:0)
如果您不想使用其他数据结构并坚持使用两个不同的整数数组..
以下代码段会帮助您
int _tmain(int argc, _TCHAR* argv[])
{
int e[] = {4,2,3,7,6,8} ;
int s[] = {2,0,4,3,7,9} ;
int temp ;
int Array_Size = 6 ; // don't use hard coded value here, rather calculate from array size
for(int i = 0 ; i < Array_Size ; i++)
{
for(int j = i+1 ; j < Array_Size ; j++)
{
if(e[i] > e[j])
{
// Swap elements in first array
temp = e[j] ;
e[j] = e[i] ;
e[i] = temp ;
// As you want both arrays in sync
// Swap elements in second array here itself
temp = s[j] ;
s[j] = s[i] ;
s[i] = temp ;
}
}
}
return 0;
}
答案 4 :(得分:0)
使用结构时非常简单。您的基本任务是对两个数组进行排序。我想建议一种方法。使用具有两个变量x和y的结构,这两个变量在此用于两个数组。制作这个结构的两个对象数组。
struct Point
{
int x,y;
};
struct Point arr[n];
在为结构对象数组提供条目后,请使用STL函数
sort(arr,arr+n,myfun);
其中myfun的功能是根据您的需要进行排序,并将其定义为
bool myfun(struct Point a,struct Point b)
{
if(a.x<b.x)
return true;
else
return false;
}
这是c ++中的完整程序
#include <bits/stdc++.h>
using namespace std;
struct Point{
int x,y;
};
bool myfun(struct Point a,struct Point b)
{
if(a.x<b.x)
return true;
else
return false;
}
int main()
{
int n; //n is the number of elements of array
cin>>n;
struct Point arr[n];
//Enter first array
for(int i=0;i<n;i++)
cin>>arr[i].x;
//Enter second array
for(int i=0;i<n;i++)
cin>>arr[i].y;
//sorting with the help of myfun
sort(arr,arr+n,myfun);
//now print the arrays
for(int i=0;i<n;i++)
cout<<arr[i].x<<" ";
cout<<"\n";
for(int i=0;i<n;i++)
cout<<arr[i].y<<" ";
return 0;
}
答案 5 :(得分:-2)
void bubbleSort(int e[], int s[], int n) {
bool swapped = true;
int j = 0;
int tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < n - j; i++) {
if (e[i] > e[i + 1]) {
tmp = e[i];
e[i] = e[i + 1];
e[i + 1] = tmp;
tmp = s[i];
s[i] = s[i + 1];
s[i + 1] = tmp;
swapped = true;
}
}
}
}