跳过空格做排序

Excel用A、B两列组成了目录结构,其中A列的日期没有按顺序排序。

AB
1DateBook Title
201.01.2022
3Title1
4Title2
503.01.2022
602.01.2022
7Title3
802.01.2022
9Title4

要求对A列的日期按顺序排序,保持空格的位置不变。B列不做更改。

DE
1DateBook Title
201.01.2022
3Title1
4Title2
502.01.2022
602.01.2022
7Title3
803.01.2022
9Title4

使用 SPL XLL

=spl("=d=E@1(?), d(p=d.pselect@a(~))=d(p).sort(),d",A2:A9)

Picture1png

函数 E@1 将片区转为单层序列。pselect@a 选出符合条件的所有成员的位置。~表示当前成员。"序列 1(位置集合)= 序列 2" 可将序列 1 的指定位置的成员修改成序列 2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 汇编语言编写冒泡排序的基本步骤是:1. 使用一个循环从数组的第一个元素开始,比较相邻的两个元素,如果第一个比第二个大,就交换它们的位置;2. 继续比较剩余的元素,直到没有相邻的元素需要比较;3. 重复第一步和第二步,直到所有元素都已排序完毕。 ### 回答2: 冒泡排序是一种简单且常用的排序算法。它通过反复交换相邻的元素来将最大或最小的元素逐渐移动到正确的位置。以下是使用汇编语言编写的冒泡排序的示例代码: ``` section .data array db 5, 2, 8, 1, 9, 3 ; 待排序的数组 array_len equ $ - array ; 数组的长度 section .text global _start _start: mov ecx, array_len ; 循环次数,初始为数组长度 dec ecx ; 每轮循环结束后减1,因为最后一个元素已经是最大的了 outer_loop: mov ebx, 0 ; 每轮循环开始时从第一个元素比较 mov edx, ecx ; 内循环次数,初始为当前循环次数 inner_loop: mov al, [array + ebx] ; 获取当前元素值 cmp al, [array + ebx + 1] ; 比较当前元素与下一个元素的大小 jle skip_swap ; 如果当前元素小于等于下一个元素,跳过交换 ; 交换当前元素与下一个元素 mov dl, [array + ebx] mov dh, [array + ebx + 1] mov [array + ebx], dh mov [array + ebx + 1], dl skip_swap: inc ebx ; 比较下一个相邻元素 dec edx ; 每轮内循环结束后减1 cmp edx, 0 ; 判断是否需要继续内循环 jne inner_loop loop outer_loop ; 继续外循环,直到所有元素都排好序 ; 排序完成后,输出排序结果 mov ebx, 0 mov ecx, array_len dec ecx mov edi, 1 ; 每行输出 1 个元素 mov esi, 0 ; 输出的元素个数 mov eax, 4 ; 使用系统调用写入 mov ebx, 1 ; 输出到标准输出 mov edx, 1 ; 每次输出 1 个字节 mov dl, ' ' ; 输出空格字符 print_loop: mov al, [array + ebx] push edx ; 保存原本的输出个数 mov edx, 1 ; 输出 1 个字节 int 0x80 ; 使用系统调用写入 pop edx ; 恢复原本的输出个数 inc ebx ; 输出下一个元素 inc esi ; 已输出的元素个数 cmp esi, edi ; 判断是否需要输出空格字符 jne print_loop mov eax, 1 ; 退出程序 xor ebx, ebx int 0x80 ``` 以上代码中使用了两个嵌套的循环,外循环控制比较次数,内循环进行相邻元素的比较和交换。每轮内循环结束后减1,因为下一轮的内循环中最后一个元素已经是最大的了。 在排序完成后,通过系统调用输出排序结果。设定输出每行一个元素,输出一个元素后,判断已输出的元素个数是否等于每行输出的元素个数,如果不相等就输出空格字符,并继续输出下一个元素。 这是一个简单例子,仅用于说明冒泡排序在汇编语言中的实现方式。实际应用中,还需要添加合适的异常处理和算法优化,以提高排序效率。 ### 回答3: 冒泡排序是一种简单的排序算法,使用汇编语言可以更加直观地理解其实现过程。下面给出一个使用汇编语言编写冒泡排序的示例代码: ```assembly section .data array db 5, 2, 9, 1, 6, 3 ; 待排序的数组 section .text global _start _start: mov ecx, 6 ; ecx用于表示数组的长度 mov ebx, 0 ; ebx用于表示当前排序轮数 outer_loop: cmp ebx, ecx ; 比较当前排序轮数和数组长度 jge done ; 如果当前排序轮数大于或等于数组长度,则排序完成 mov eax, 0 ; eax用于表示循环次数,初始为0,每一轮排序减1 inner_loop: cmp eax, ecx ; 比较当前循环次数和数组长度 jge outer_loop_end ; 如果当前循环次数大于或等于数组长度,则本轮排序结束 mov edx, eax ; edx用于保存当前循环次数 inc edx ; edx加1,得到下一个元素的索引 mov al, [array+eax] ; al保存当前元素的值 mov bl, [array+edx] ; bl保存下一个元素的值 cmp al, bl ; 比较当前元素和下一个元素的值 jle continue ; 如果当前元素小于等于下一个元素,则跳过交换操作 mov [array+eax], bl ; 交换当前元素和下一个元素的值 mov [array+edx], al continue: inc eax ; eax加1,继续下一次循环 jmp inner_loop ; 跳回内层循环的开始 outer_loop_end: inc ebx ; ebx加1,继续下一轮排序 jmp outer_loop ; 跳回外层循环的开始 done: ; 排序完成,输出结果 mov ecx, 6 ; ecx用于表示数组的长度 mov esi, array ; esi指向数组的首地址 print_loop: mov dl, [esi] ; dl保存当前元素的值 add dl, '0' ; 转换为ASCII码 mov [result+ecx-1], dl ; 保存到结果数组 inc esi ; 指向下一个元素 dec ecx ; ecx减1,继续下一次循环 cmp ecx, 0 ; 比较ecx和0 jne print_loop ; 如果ecx不为0,则继续循环 print_result: mov eax, 4 ; 使用系统调用输出结果 mov ebx, 1 mov edx, 6 ; 输出6个字符 mov ecx, result int 0x80 exit: mov eax, 1 ; 退出程序 xor ebx, ebx int 0x80 ``` 以上是一个简单的汇编语言冒泡排序的示例代码,通过比较当前元素和下一个元素的大小,实现交换操作,从而将最大元素逐渐“冒泡”到数组的末尾。最后通过系统调用输出排序结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值