一个简单的排序,请教一下大家有什么好的算法

localxiao 2010-04-08 10:07:20
有若干个数,将它们从小到大排序后输出,并输出每个整数输入时的序号

比如:
3 1 8 5
输出应该是
1 3 5 8
2 1 3 4 (原来的位置)

请大家尽量少的使用变量,2个数组就没意思了

...全文
134 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanmie_09 2010-04-08
  • 打赏
  • 举报
回复
我觉得这跟排序的过程有点类似。
只是不涉及到元素的交换而已,每次找到一个最小元素,输出下标和元素值,然后将输出的数组元素置为一个最大值。

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

#define N 200

int main()
{
int a[N];
int i, j, k, n;
scanf("%d", &n);
for(i = 0; i < n; i++) {
scanf("%d", a+i);
}
for(i = 0; i < n; i++) {
k = i;
for(j = 0; j < n; j++) {
if(a[k] > a[j]) {
k = j;
}
}
printf("%d: %d\n", k + 1, a[k]);
a[k] = pow(2, sizeof(int)*8-1) - 1; //置已经输出过的元素为最大整型数
}
return 0;
}

代码有一个bug,就是输入的数组元素值必须小于最大整型数.
localxiao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mstlq 的回复:]

8楼是通用代码……
针对楼主的题目,可以用下面的简化版本(使用两个int变量i和j)
C/C++ code

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


int data[4]={3,1,8,5};
int main()
{
int i=0,j=0;
while (1)
{
for(i=0;data[i]==0 &a……
[/Quote]

嗯,一时好奇而已

没有其他实际用途。。

平时肯定不会去写这种代码
mstlq 2010-04-08
  • 打赏
  • 举报
回复
8楼是通用代码……
针对楼主的题目,可以用下面的简化版本(使用两个int变量i和j)

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


int data[4]={3,1,8,5};
int main()
{
int i=0,j=0;
while (1)
{
for(i=0;data[i]==0 && i<4;++i);
if (i==4) break;
for(j=0;j<4;++j)
{
if(data[j]==0) continue;
if(data[j]<data[i])
i=j;
}
printf("num:%3d\tpos:%3d\n",data[i],i+1);
data[i]=0;
}
return 0;
}


最后指出,这样的搞法很费cpu,楼主的需求(控制内存使用)其实非常没有实用意义……
mstlq 2010-04-08
  • 打赏
  • 举报
回复
对七楼的一点小修正

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


int data[11]={3,1,8,5,9,4,6,7,8,34,6};
int main()
{
int i=0,j=0,n=0;
for(n=0;n<=sizeof(data)/sizeof(data[0]);++n){
for(i=0;i<sizeof(data)/sizeof(data[0]);++i){
if (data[i]==n)
break;
}
if (i==sizeof(data)/sizeof(data[0])) break;
}


while (1)
{
for(i=0;data[i]==n && i<sizeof(data)/sizeof(data[0]);++i);
if (i==sizeof(data)/sizeof(data[0])) break;
for(j=0;j<sizeof(data)/sizeof(data[0]);++j)
{
if(data[j]==n) continue;
if(data[j]<data[i])
i=j;
}
printf("num:%3d\tpos:%3d\n",data[i],i);
data[i]=n;
}
return 0;
}


用于解决楼主那个数组的版本

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


int data[4]={3,1,8,5};
int main()
{
int i=0,j=0,n=0;
for(n=0;n<=sizeof(data)/sizeof(data[0]);++n){
for(i=0;i<sizeof(data)/sizeof(data[0]);++i){
if (data[i]==n)
break;
}
if (i==sizeof(data)/sizeof(data[0])) break;
}


while (1)
{
for(i=0;data[i]==n && i<sizeof(data)/sizeof(data[0]);++i);
if (i==sizeof(data)/sizeof(data[0])) break;
for(j=0;j<sizeof(data)/sizeof(data[0]);++j)
{
if(data[j]==n) continue;
if(data[j]<data[i])
i=j;
}
printf("num:%3d\tpos:%3d\n",data[i],i+1);
data[i]=n;
}
return 0;
}
mstlq 2010-04-08
  • 打赏
  • 举报
回复
使用3个int变量的通用法……

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


int data[11]={3,1,8,5,9,4,6,7,8,34,6};
int main()
{
int i=0,j=0,n=0;
for(n=0;n<=sizeof(data)/sizeof(data[0]);++n){
for(i=0;i<sizeof(data)/sizeof(data[0]);++i){
if (data[i]==n)
break;
}
if (i==sizeof(data)/sizeof(data[0])) break;
}


while (1)
{
for(i=0;data[i]==n && i<sizeof(data)/sizeof(data[0]);++i);
if (i==sizeof(data)/sizeof(data[0])) break;
for(j=0;j<sizeof(data)/sizeof(data[0]);++j)
{
if(data[j]==n) continue;
if(data[j]<data[i])
i=j;
}
printf("num:%3d\tpos:%3d\n",data[i],i);
data[i]=n;
}
return 0;
}
xinzaiyiqi 2010-04-08
  • 打赏
  • 举报
回复
不用数组就用链表吧
先形成一个链表,节点含有其序号
再遍历链表,把最小的及其序号输出
删除此节点,重复上述过程
localxiao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiuxianshen 的回复:]

C/C++ code

struct array
{
int arrData;
int arrIndex;
}ARRAY;


把数组的数据和下表存入ARRAY[arrLen]中,根据arrData排序,然后顺序输出arrIndex就可以了啊
[/Quote]

你这个就没意思了啊,我就是想尽量少的用到其他变量存放

指针相减确实是好方法,只要记录一个数组元素的位置,就可以获得其他的相对位置

但是如果不是数组呢,10个零散的数据

纯粹是好奇,刚刚看到这题有点意思
xiuxianshen 2010-04-08
  • 打赏
  • 举报
回复

struct array
{
int arrData;
int arrIndex;
}ARRAY;

把数组的数据和下表存入ARRAY[arrLen]中,根据arrData排序,然后顺序输出arrIndex就可以了啊
localxiao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 localxiao 的回复:]
有若干个数,将它们从小到大排序后输出,并输出每个整数输入时的序号

比如:
3 1 8 5
输出应该是
1 3 5 8
2 1 3 4 (原来的位置)

请大家尽量少的使用变量,2个数组就没意思了
[/Quote]

写错了,应该是
输入
3 1 8 5
输出:
1 3 5 8
2 1 4 3
jackyjkchen 2010-04-08
  • 打赏
  • 举报
回复
请使用库函数qsort,只需要写一个回调


int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
AlanBruce 2010-04-08
  • 打赏
  • 举报
回复
呵呵
不熟悉C了

69,364

社区成员

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

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