硬汉嵌入式论坛

 找回密码
 立即注册
查看: 879|回复: 11
收起左侧

[技术讨论] 请问怎么把数组下标为偶数的排在前面,下标为奇数的放后面?

[复制链接]

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2022-8-22 19:47:39 | 显示全部楼层 |阅读模式
DMA转换完的数据是按:  CH0, CH1, CH0, CH1,排列的。数组中,偶数下标放CH0的数据,奇数下标放着CH1的数据。
现在希望把数组整理一下,偶数的排前面一半数组,奇数的放后面一半数组。
尽量不借助其它的资源,请问有啥算法?
例如排序后为: CH0 CH0 CH1 CH1


回复

使用道具 举报

78

主题

692

回帖

926

积分

金牌会员

积分
926
发表于 2022-8-22 20:27:31 | 显示全部楼层
改变一下访问方式就可以了呀。偶数按偶数索引,奇数的按奇数索引。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-8-23 10:12:18 | 显示全部楼层
庄永 发表于 2022-8-22 20:27
改变一下访问方式就可以了呀。偶数按偶数索引,奇数的按奇数索引。

另外一个函数的入参,需要连续的数组。我改不了另外一个函数
回复

使用道具 举报

78

主题

692

回帖

926

积分

金牌会员

积分
926
发表于 2022-8-23 10:54:54 | 显示全部楼层
snakeemail 发表于 2022-8-23 10:12
另外一个函数的入参,需要连续的数组。我改不了另外一个函数

多次交换实现本地修改
[C] 纯文本查看 复制代码
void swap(int *arr, int arrlen)
{
    int temp;
    int i = 0;
    int j = 0;
        
    for (i = 0; i < ((arrlen - 1)>>1); i++)
    {
        for (j = i + 1; j < arrlen - (i + 1); )
        {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            j += 2;
        }
    }
}
回复

使用道具 举报

78

主题

692

回帖

926

积分

金牌会员

积分
926
发表于 2022-8-23 10:55:22 | 显示全部楼层
snakeemail 发表于 2022-8-23 10:12
另外一个函数的入参,需要连续的数组。我改不了另外一个函数

长度必须是偶数
回复

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2022-8-23 12:31:58 | 显示全部楼层
[C] 纯文本查看 复制代码
#include <stdio.h>

#define _XOR_SWAP(a, b) \
    (a) = (a) ^ (b); \
    (b) = (b) ^ (a); \
    (a) = (a) ^ (b)

void sort(int *arr, int size) {
    int half = size >> 1;

    int i, offset;
    for (i = 1; i < half; i += 2) {
        offset = half + i;
        _XOR_SWAP(arr[i], arr[offset]);
    }
}

int main(int argc, char **argv) {
    int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    sort(arr, 10);
    for (int i = 0; i < 10; i++)
        printf("%d, ", arr[i]);
    printf("\n");

    return 0;
}


最终输出
0, 6, 2, 8, 4, 5, 1, 7, 3, 9


回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-8-23 18:12:23 | 显示全部楼层
庄永 发表于 2022-8-23 10:54
多次交换实现本地修改
[mw_shl_code=c,true]void swap(int *arr, int arrlen)
{

谢谢。我理解一下算法
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-8-23 19:10:27 | 显示全部楼层
庄永 发表于 2022-8-23 10:54
多次交换实现本地修改
[mw_shl_code=c,true]void swap(int *arr, int arrlen)
{

请教一下,这些偏门的算法,是怎么想出来的?一般人这哪想得出来。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-8-23 19:11:53 | 显示全部楼层
kingdjh 发表于 2022-8-23 12:31
[mw_shl_code=c,true]#include

#define _XOR_SWAP(a, b) \

输入: int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
输出: {0,2,4,6,8,  1,3,5,7,9}
兄台,你的输出不是我说的意思
回复

使用道具 举报

78

主题

692

回帖

926

积分

金牌会员

积分
926
发表于 2022-8-23 20:28:38 | 显示全部楼层
snakeemail 发表于 2022-8-23 19:10
请教一下,这些偏门的算法,是怎么想出来的?一般人这哪想得出来。

不偏门的那都是别人已经设计好的。现有算法不能解决问题的时候,都是从头设计构思的。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-9-13 20:04:56 | 显示全部楼层
kingdjh 发表于 2022-8-23 12:31
[C] 纯文本查看 复制代码
#include 

#define _XOR_SWAP(a, b) \
[/quote]

[mw_shl_code=c,true]void swap2(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void Left_Move_Array(int *array, int which, const int leftMv)
{
    for(int i=0;i<leftMv;i++)
    {
        swap2(&array[which], &array[which-1]);
        which--;
    }

}

void swap_odd_even(int *arr, int arrlen)
{
    int i; // i表示第几个偶数,

    int sMvCnt = arrlen/2; // 共有多少数要移动

    for (i = 1; i < sMvCnt; i++) // 总共有4个偶数要移动。第0个偶数不动,从第1个偶数开始
    {
        Left_Move_Array(arr, i*2, i); //第0个偶数,向左交换0次,第1个,向左交换一次,依此类推

        print(arr, arrlen);
    }
}

回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2022-9-17 21:51:55 | 显示全部楼层
自己把奇数和偶数复制一份,然后传给调用函数。
那个交叉排列是 ADC DMA 采样方式 输出就是这个顺序,改不了的。
如果你有 3 个 ADC 通道进行 DMA 采样,输出的就是 123123这样,你也改不了,只能再复制一遍
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 17:07 , Processed in 0.183500 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表