北航机试题求救

duanjun1987618 2010-03-10 10:19:14
2 数组排序
输入一个数组的值,求出各个值从小到大排序后的次序。
输入:输入的第一个数为数组的长度,后面的数为数组中的值,以空格分割
输出:各输入的值按从小到大排列的次序。
sample
input:
4
-3 75 12 -3
output:
1 3 2 1

...全文
167 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-03-10
  • 打赏
  • 举报
回复
结果不对啊,是0 3 2 1,应该是1 3 2 1
huanmie_09 2010-03-10
  • 打赏
  • 举报
回复

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

typedef struct arr{
int elem; /*元素值*/
int index; /*下标值*/
} ARR;

/*交换元素*/
void replace(ARR* a, ARR* b)
{
ARR temp;
temp.elem = a->elem;
temp.index = a->index;
a->elem = b->elem;
a->index = b->index;
b->elem = temp.elem;
b->index = temp.index;
}

/*按元素值对数组进行选择排序*/
void sort(ARR a[], int n)
{
int k, index, i;
for(k = 0; k < n - 1; k++) {
index = k;
for(i = k + 1; i < n; i++) {
if(a[i].elem <a[index].elem) {
index = i;
}
}
if(index != k) {
replace(&a[k], &a[index]);
}
}
}

/*为数组元素赋值*/
void input(ARR a[],int len)
{
int i=0;
for(; i < len; i++) {
scanf("%d", &a[i].elem);
a[i].index = i;
}
}

/*打印输出下标值*/
void display(ARR a[],int len)
{
int i = 0;
for(; i < len; i++)
printf("%d ", a[i].index);
printf("\n");
}


/*测试*/
int main()
{
int i, n;
ARR *a;
scanf("%d", &n);
a = (ARR *)malloc(n*sizeof(ARR));
input(a, n);
sort(a, n);
display(a, n);
free(a);
return 0;
}


icansaymyabc 2010-03-10
  • 打赏
  • 举报
回复
偷点懒,把1楼老兄的代码稍加修改,呵呵!


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

typedef struct arr{
int elem; /*元素值*/
int index; /*下标值*/
} ARR;

void sort(ARR a[], int n)
{
int k, index, i;
int lv,sn, mv, mi;
lv=0x7fffffff;sn=1;
for(k = 0; k < n; k++) {
mv=0x7fffffff;mi=-1;
for(i=0;i<n;i++){
if(a[i].index == 0){
if(a[i].elem <= mv){
mv=a[i].elem;
mi=i;
}}}
sn+=(mv>lv);
a[mi].index = sn;
lv=mv;
}
}

/*为数组元素赋值*/
void input(ARR a[],int len)
{
int i=0;
for(; i < len; i++) {
scanf(" %d", &a[i].elem);
a[i].index = 0;
}
}

/*打印输出下标值*/
void display(ARR a[],int len)
{
int i = 0;
for(; i < len; i++)
printf("%d ", a[i].index);
printf("\n");
}


/*测试*/
int main()
{
int i, n;
ARR *a;
scanf("%d", &n);
a = (ARR *)malloc(n*sizeof(ARR));
input(a, n);
sort(a, n);
display(a, n);
free(a);
return 0;
}

huanmie_09 2010-03-10
  • 打赏
  • 举报
回复
引用 2 楼 duanjun1987618 的回复:
结果不对啊,是0 3 2 1,应该是1 3 2 1

开始以为只是输出原始的下标号,原来是经过排序后的编号,在结构体中增加了一个排序号成员。
数据排序完成后,给数组元素打上排序号。
然后输出的时候注意一下,由结构体的index值来还原原始数组的序号,并输出其排序号即可。
huanmie_09 2010-03-10
  • 打赏
  • 举报
回复

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

typedef struct arr{
int elem; /*元素值*/
int index; /*下标值*/
int sq; /*排序号*/
} ARR;

/*交换两个结构体元素*/
void replace(ARR* a, ARR* b)
{
ARR temp;
temp.elem = a->elem;
temp.index = a->index;
a->elem = b->elem;
a->index = b->index;
b->elem = temp.elem;
b->index = temp.index;
}

/*按值大小对结构体数组进行排序, 并对数组元素进行编号*/
void sort(ARR a[], int n)
{
int k, index, i;
int j = 1;

for(k = 0; k < n - 1; k++) {
index = k;
for(i = k + 1; i < n; i++) {
if(a[i].elem <a[index].elem) {
index = i;
}
}
if(index != k) {
replace(&a[k], &a[index]);
}
}
/*按值大小对数组元素进行编号*/
for(i = 0; i < n; i++) {
while(a[i].elem==a[i+1].elem && i < n) {
a[i].sq = j;
a[i+1].sq = j;
i++;
}
if(i < n) {
a[i].sq = j;
}
j++;
}

}


/*输入*/
void input(ARR a[],int len)
{
int i=0;
for(; i < len; i++) {
scanf("%d", &(a[i].elem));
a[i].index = i;
}
}

/*打印输出*/
void display(ARR a[],int len)
{
int i = 0;
int j = 0;
for(; i < len; i++) {
for(j = 0; j < len; j++) {
if(i == a[j].index) {
printf("%d ", a[j].sq);
}
}
}
printf("\n");
}


/*测试*/
int main()
{
int i, n;
ARR *a;
scanf("%d", &n);
a = (ARR *)malloc(n*sizeof(ARR));
input(a, n);
sort(a, n);
display(a, n);
free(a);
return 0;
}


chhch11111 2010-03-10
  • 打赏
  • 举报
回复
//排序函数
public string paixu(int u, int[] a)//u为元素个数,a为输入的元素值保存的数组
{
ct[] ct1=new ct[u+1];
//建立链表
for(int i=0;i<u+1;i++)
{
int n = 0;
ct1[i].up = 0;
ct1[i].nex = 0;
ct1[i].value = int.MinValue;
if (i > 0)
{
ct1[i].value = a[i - 1];
int t = i - 1;
while (ct1[i].value < ct1[t].value)
{
n = t;
t = ct1[t].up;
}
ct1[i].up = t;
ct1[i].nex = n;
ct1[t].nex = i;
ct1[n].up = i;
}
}
//得到序号
int k = ct1[0].nex;
int m = 0;
while (k > 0)
{
m++;
if (ct1[k].up != 0 && ct1[k].value == ct1[ct1[k].up].value)
{
m--;
}
ct1[k].NO = m;
}

}
chhch11111 2010-03-10
  • 打赏
  • 举报
回复
public struct ct
{
public int value;//值
public int up;//上一个元素
public int nex;//下一个元素
public int NO;//序号
}
//排序函数
public string paixu(int u, int[] a)//u为元素个数,a为输入的元素值保存的数组
{
ct[] ct1=new ct[u+1];
//建立链表
for(int i=0;i<5;i++)
{
int n = 0;
ct1[i].up = 0;
ct1[i].nex = 0;
ct1[i].value = int.MinValue;
if (i > 0)
{
ct1[i].value = a[i - 1];
int t = i - 1;
while (ct1[i].value < ct1[t].value)
{
n = t;
t = ct1[t].up;
}
ct1[i].up = t;
ct1[i].nex = n;
ct1[t].nex = i;
ct1[n].up = i;
}
}
//得到序号
int k = ct1[0].nex;
int m = 0;
while (k > 0)
{
m++;
if (ct1[k].up != 0 && ct1[k].value == ct1[ct1[k].up].value)
{
m--;
}
ct1[k].NO = m;
}

}
自己做下修改吧,算法应该是没问题的

69,371

社区成员

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

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