用C语言对一维数组排序,并输出已排好元素的原来位置

我举个简单例子,一个一维数组int a[5]={3, 8, 4, 7, 6}
按降序排列以后是int b[5]={8, 7, 6, 4, 3}
最大的元素8在原来的数组中是第二位,7是第四位,等等
得到一个表示原来位置的数组int c[5]={2, 4, 5, 3, 1}

用C语言编程实现,简单讲一下思路即可
多谢帮助!满意答案有加分

简单的思路:

定义一个指针数组,找到b数组中元素在a数组中的地址,并存储在指针数组对应位置。

之后将指针数组内的地址值依次取出来与a数组首地址相减,得到的就是原来的位置。

利用的原理:数组内地址是连续的!

#include <stdio.h>
int main()
{
    int a[5]={3, 8, 4, 7, 6}, b[5]={8, 7, 6, 4, 3},c[5],i,j,*p[5];
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            if(b[i]==a[j])
                p[i]=&a[j];
        }
    }

    for(i=0;i<5;i++)
        c[i]=p[i]-&a[0]+1;
    printf("原来的位置数组c[5]={%d,%d,%d,%d,%d}\n",c[0],c[1],c[2],c[3],c[4]);
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-02-28
/*我举个简单例子,一个一维数组int a[5]={3, 8, 4, 7, 6}
按降序排列以后是int b[5]={8, 7, 6, 4, 3}
最大的元素8在原来的数组中是第二位,7是第四位,等等
得到一个表示原来位置的数组int c[5]={2, 4, 5, 3, 1}*/
#include<stdio.h>

void main()

int i,j,k=0;
int a[5]={3, 8, 4, 7, 6};
int b[5]={8, 7, 6, 4, 3};
int c[5] = {0};
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
if (b[i]==a[j])
{
c[k++] = j+1; //因为说的是第几位而不是下标 所以加1
break;

}
}
for (i=0;i<5;i++)
{
printf("%d ",c[i]);
}
}
2 4 5 3 1 Press any key to continue

第2个回答  推荐于2017-11-23
方法1:比较笨的办法是先排好。再在里面找。看是原来的第几个。 (代码我就不写了。)
方法2:有一个很快的方法,就是用快速排序排,
如果你深入的了解了快排,那么这个就很简单了。而且效率很高。
我给你写代码。本回答被提问者采纳
第3个回答  推荐于2016-07-25
  
  方法1:比较笨的办法是先排好。再在里面找。看是原来的第几个。
  方法2:有一个很快的方法,就是用快速排序排,
  #include "stdio.h"//
  void main(void){
  int a[6]={8,5,2,7,9,4},b[6],c[6],i,j,x;
  for(i=0;i<6;c[i]=1+i++)
  printf("%d ",b[i]=a[i]);
  printf("\n");
  for(i=0;i<6;i++){
  for(x=i,j=x+1;j<6;j++)
  if(b[x]<b[j]) x=j;
  if(x!=i){
  j=b[i];
  b[i]=b[x];
  b[x]=j;
  j=c[i];
  c[i]=c[x];
  c[x]=j;
  }
  }
  for(i=0;i<6;printf("%d ",b[i++]));
  printf("\n");
  for(i=0;i<6;printf("%d ",c[i++]));
  printf("\n");
  }
第4个回答  2010-11-14
用选择法排序,优化过的选择法。

先挑出5个数中的最大值,并记录其下标,将该数与第一位的数字交换,并将该下标存入c数组。然后挑出剩下n-1个数的最大值,记录下标存入c,并与第二个位置进行交换,以此类推。。。。
相似回答