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

leehh 2011-01-05 06:26:07
排序好排,但是将其下标返回该如何实现?

比如a[]={ 5,1,3,4,2}
排序完后应该是a[]={1,2,3,4,5},
而其下标在原数组中位b[]={1,4,2,3,0}
...全文
1407 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoguanghuineu 2012-09-22
  • 打赏
  • 举报
回复
如何写出 快排的 带返回位置的排序算法
leehh 2011-01-06
  • 打赏
  • 举报
回复
你们可真是厉害,多谢你们。
we_sky2008 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dizuo 的回复:]
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)
ret……
[/Quote]
呵呵,有意思,
虽然没有实际对src排序,但输出的确实排序后的效果。
ryfdizuo 2011-01-05
  • 打赏
  • 举报
回复
8楼的思路其实和结构体是一回事。
改进了一下:

#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;
}



1 1
2 4
3 2
4 3
5 0
请按任意键继续. . .

we_sky2008 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 we_sky2008 的回复:]
可以使用结构体,前面大家都提到了,我这里使用另外一种方法:

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)
……
[/Quote]
这个是基于选择排序的,再来个插入排序的:

#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; i++)
{
int val = src[i];
for (j = i; j > 0; j--)
{
if (val < src[j - 1])
{
src[j] = src[j - 1];
index[j] = index[j - 1];
}
else
break;
}
src[j] = val;
index[j] = i;
}

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;
}


flysnowhite 2011-01-05
  • 打赏
  • 举报
回复
用结构体比较直观。
struct pair

int m;
int index;
};
we_sky2008 2011-01-05
  • 打赏
  • 举报
回复
可以使用结构体,前面大家都提到了,我这里使用另外一种方法:

#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;
}



無_1024 2011-01-05
  • 打赏
  • 举报
回复
定义结构体吧 一个用来存取值 一个用来存取序号 再用值来完成结构体的排序
luxihua 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 matrixcl 的回复:]

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……
[/Quote]
++
ok1411 2011-01-05
  • 打赏
  • 举报
回复
可以定义个结构体
或者再定一个数组,值为1~n,原数组做排序时如何变化的,该数组也做相应变化就行了
就想叫yoko 2011-01-05
  • 打赏
  • 举报
回复
如果你是要生成你这里写的这么一个数组b
那么你在排序时候生成它就好了
matrixcl 2011-01-05
  • 打赏
  • 举报
回复
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结构体

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧