首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数组从大到小排序,并返回他们原先在数组的上标位置

2012-09-25 
数组从大到小排序,并返回他们原先在数组的下标位置排序好排,但是将其下标返回该如何实现?比如a[]{ 5,1,3,

数组从大到小排序,并返回他们原先在数组的下标位置
排序好排,但是将其下标返回该如何实现?

比如a[]={ 5,1,3,4,2}
排序完后应该是a[]={1,2,3,4,5},
而其下标在原数组中位b[]={1,4,2,3,0}

[解决办法]
a[] 中不要只存数据,定义一个结构体

struct Data
{
int m_data;
int m_index;
};

其中存数据及原始下标。

原始数据应该是一个Data的结构体
Data origData[];
for (int i=0; i<5; i++)
{
origData[i].m_data = a[i];
origData[i].m_index = i;
}


对origData排序,每次交换对是交换整个Data结构体


[解决办法]
如果你是要生成你这里写的这么一个数组b
那么你在排序时候生成它就好了
[解决办法]
可以定义个结构体
或者再定一个数组,值为1~n,原数组做排序时如何变化的,该数组也做相应变化就行了
[解决办法]

探讨

a[] 中不要只存数据,定义一个结构体

struct Data
{
int m_data;
int m_index;
};

其中存数据及原始下标。

原始数据应该是一个Data的结构体
Data origData[];
for (int i=0; i<5; i++)
{
origData[i].m_data = a[i];
ori……

[解决办法]
可以使用结构体,前面大家都提到了,我这里使用另外一种方法:
C/C++ code
#include<stdio.h>#include<stdlib.h>int my_sort(int src[], int size, int index[]){    int i, j;    if (src == NULL || index == NULL)        return 0;    for (i = 0; i < size - 1; i++)    {        for (j = i + 1; j < size; j++)        {            if (src[j] < src[i])            {                int tmp = src[j];                src[j] = src[i];                src[i] = tmp;                tmp = index[i];                index[i] = index[j];                index[j] = tmp;            }                     }    }    return 1;}int main(){    int i;    int src[] = { 5,1,3,4,2};    int index[sizeof(src) / sizeof(src[0])];    for (i = 0; i < sizeof(src) / sizeof(src[0]); i++)        index[i] = i;    if (my_sort(src, sizeof(src) / sizeof(src[0]), index))    {        for (i = 0; i < sizeof(src) / sizeof(src[0]); i++)        {            printf("%d\t%d\n", src[i], index[i]);        }    }    system("pause");    return 0;}
[解决办法]
用结构体比较直观。
struct pair

int m;
int index;
};
[解决办法]
探讨
可以使用结构体,前面大家都提到了,我这里使用另外一种方法:

C/C++ code

#include<stdio.h>
#include<stdlib.h>

int my_sort(int src[], int size, int index[])
{
int i, j;

if (src == NULL || index == NULL)
……

[解决办法]
8楼的思路其实和结构体是一回事。
改进了一下:
C/C++ code
#include<stdio.h>#include<stdlib.h>int my_sort(int src[], int size, int index[]){    int i, j;    if (src == NULL || index == NULL)        return 0;    for (i = 0; i < size - 1; i++)    {        for (j = i + 1; j < size; j++)        {            //if (src[j] < src[i])            if ( src[ index[j] ] < src[ index[i] ] )            {                int tmp = index[i];                index[i] = index[j];                index[j] = tmp;            }                     }    }    return 1;}int main(){    int i;    int src[] = { 5,1,3,4,2};    int index[sizeof(src) / sizeof(src[0])];    for (i = 0; i < sizeof(src) / sizeof(src[0]); i++)        index[i] = i;    if (my_sort(src, sizeof(src) / sizeof(src[0]), index))    {        for (i = 0; i < sizeof(src) / sizeof(src[0]); i++)        {            printf("%d\t%d\n", src[ index[i] ], index[i]);        }    }    system("pause");    return 0;} 

热点排行