2828|16

9812

帖子

24

TA的资源

版主

楼主
 

数组排序问题 [复制链接]

 

有一个数组uint8_t buf[] = {7,8,9,1,2,3,4,5,6};

不需要判断数组内保存的数值,如果只允许使用一个变量"uint8_t tmp",请问怎么能把buf快速设置成{1,2,3,4,5,6,7,8,9}?

 

最新回复

其实如果考虑大小的话,tmp都可以不用   详情 回复 发表于 2021-2-7 15:19
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 

冒泡排序?

点评

这个和冒泡还不太一样 ,因为不需要考虑数组内的内容,只是把指定索引后的数据移到最前边,再把这个索引前的数据补到最后边  详情 回复 发表于 2020-12-24 23:39
相当于把123456左移3次,再把789补到6后边,如果再创建一个数组会很方便,不过如果这个数组很长,内存又有限,怎么能对这个数组快速处理就是个问题  详情 回复 发表于 2020-12-24 23:35
 
 
 

回复

9812

帖子

24

TA的资源

版主

板凳
 
dcexpert 发表于 2020-12-24 22:14 冒泡排序?

相当于把123456左移3次,再把789补到6后边,如果再创建一个数组会很方便,不过如果这个数组很长,内存又有限,怎么能对这个数组快速处理就是个问题

点评

那不还是和冒泡排序是差不多吗  详情 回复 发表于 2020-12-25 08:47
 
 
 

回复

9812

帖子

24

TA的资源

版主

4
 
dcexpert 发表于 2020-12-24 22:14 冒泡排序?

这个和冒泡还不太一样 ,因为不需要考虑数组内的内容,只是把指定索引后的数据移到最前边,再把这个索引前的数据补到最后边

 
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

5
 

能不能这样:定义的时候稍微大一点uint8_t buf[] = {7,8,9,1,2,3,4,5,6,0,0,0};再定义一个指针指向uint8_t *ptr=&buf[3];每次排序只要将789的内容挪到最后面去,这样ptr[]就可以当作排序后的数组使用了。

个人签名模电临时工
 
 
 

回复

1万

帖子

25

TA的资源

版主

6
 
littleshrimp 发表于 2020-12-24 23:35 相当于把123456左移3次,再把789补到6后边,如果再创建一个数组会很方便,不过如果这个数组很长,内存又 ...

那不还是和冒泡排序是差不多吗,效率稍低,但是简单占用内存少

 
 
 

回复

4008

帖子

0

TA的资源

版主

7
 

排序算法和数据的特征有关系,你这个数据量太少不太好说是什么特征

基本有序的情况我记得是堆排序最快,记不太清楚了.

 
 
 

回复

4008

帖子

0

TA的资源

版主

8
 

效率问题还得和实际情况结合,比如每一个数据对应磁盘上一个文件,要移动一次文件花费的时间就是很多,这时候尽量减少移动的次数就很重要.

 
 
 

回复

6124

帖子

4

TA的资源

版主

9
 
本帖最后由 damiaa 于 2020-12-25 14:52 编辑

 

 

选择排序慢了点
//冒泡法快点

 

 
 
 

回复

6037

帖子

195

TA的资源

版主

10
 

这是某本数据结构书里的一道课后题

第一步:翻转7-9的顺序

第二步:翻转1-6的顺序

第三步:翻转整个数组

点评

这种方法能实现,不过需要很多步。  详情 回复 发表于 2020-12-28 14:57
 
 
 

回复

9812

帖子

24

TA的资源

版主

11
 

数据中每个数据的位置都要移动,移动的次数最少是buf_len +1次

我能想到通过下边方式移动数据

但是代码怎么写现在还没有思路

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

1942

帖子

2

TA的资源

版主

12
 

是一个值得思考的问题哈,先拿小本本记下来,说不定就想到好点子了。

 
 
 

回复

257

帖子

0

TA的资源

一粒金砂(高级)

13
 

用y= x+4  [0 ,5]  ; y=x-6 [6,9] 来转换下buf[y] 的坐标呢;

 
 
 

回复

9812

帖子

24

TA的资源

版主

14
 
lcofjp 发表于 2020-12-25 11:18 这是某本数据结构书里的一道课后题 第一步:翻转7-9的顺序 第二步:翻转1-6的顺序 第三步:翻转整 ...

这种方法能实现,不过需要很多步。

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

15
 

排序太简单了把, 一般环形有序数组出题都是考二分查找的。

 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

16
 


uint8_t buf[] = {7,8,9,1,2,3,4,5,6};

#define change(src, a, b)   if((a) > (b)){(src) = (a); (a) = (b); (b) = (src);}
void main()
{
  uint8_t tmp;
  change(tmp, buf[0], buf[1]);
  change(tmp, buf[0], buf[2]);
  change(tmp, buf[0], buf[3]);
  change(tmp, buf[0], buf[4]);
  change(tmp, buf[0], buf[5]);
  change(tmp, buf[0], buf[6]);
  change(tmp, buf[0], buf[7]);
  change(tmp, buf[0], buf[8]); 
  
  change(tmp, buf[1], buf[2]);
  change(tmp, buf[1], buf[3]);
  change(tmp, buf[1], buf[4]);
  change(tmp, buf[1], buf[5]);
  change(tmp, buf[1], buf[6]);
  change(tmp, buf[1], buf[7]);
  change(tmp, buf[1], buf[8]); 
  
  change(tmp, buf[2], buf[3]);
  change(tmp, buf[2], buf[4]);
  change(tmp, buf[2], buf[5]);
  change(tmp, buf[2], buf[6]);
  change(tmp, buf[2], buf[7]);
  change(tmp, buf[2], buf[8]); 
  
  change(tmp, buf[3], buf[4]);
  change(tmp, buf[3], buf[5]);
  change(tmp, buf[3], buf[6]);
  change(tmp, buf[3], buf[7]);
  change(tmp, buf[3], buf[8]); 
  
  change(tmp, buf[4], buf[5]);
  change(tmp, buf[4], buf[6]);
  change(tmp, buf[4], buf[7]);
  change(tmp, buf[4], buf[8]); 
  
  change(tmp, buf[5], buf[6]);
  change(tmp, buf[5], buf[7]);
  change(tmp, buf[5], buf[8]); 
  
  change(tmp, buf[6], buf[7]);
  change(tmp, buf[6], buf[8]); 
  
  change(tmp, buf[7], buf[8]);
}
 

 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

17
 

其实如果考虑大小的话,tmp都可以不用

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表