如何对一个数组进行排序并在C ++中获取相应的第二个数组?

时间:2015-10-29 05:16:48

标签: c++ arrays sorting

我有两个相同大小的数组。并且希望正常排序其中一个数组,然后相应地对下一个数组元素进行排序。 我们假设我们有两个数组

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}

我该怎么做?我应该使用这两个类对象作为私有成员然后继续吗?如果是这样,怎么做?

6 个答案:

答案 0 :(得分:3)

创建单个数组(或vectorstd::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;
                  }
            }
      }
}