雷德算法前言
今天老师讲了快速傅里叶变换,查了一些资料了解到快速傅里叶变换需要用到雷德算法,于是看了一下雷德算法的相关介绍和代码,发现道理我都懂就是看不懂别人的代码,自己写了一个雷德算法的代码,测了几个数据都和别人的代码结果一样。还是没理解别人的代码……不清楚为什么需要判断i < j?QAQ
把我自己的代码放上来和大家探讨探讨。
算法思路
具体来说,就是数字j的下一个数字是在j的最高位加一,高位向地位进位,eg: 用5举个栗子:5(110)的最高位加1得0,次高位+1得0,最低位+1得1,所以5的下一位是1(001)
具体代码
#include <cstdio>
#define ARRAYSIZE 8 #数组长度
// 打印出数组
void print_array(int arr[], int num) {
for (int i = 0; i < num; i++) {
printf("%d\t", arr[i]);
}
putchar('\n');
}
int main() {
// 对数组初始化为0
int arr[ARRAYSIZE] = {0};
// ---------雷德算法-----------
// 默认数组第一个元素为0
for (int i = 1; i < ARRAYSIZE; i++) {
int tmp = ARRAYSIZE >> 1; // 获得最高位为1其他为0的数字,eg.1000/100/10
int pre_value = arr[i-1]; // 获得上一个数字
while (pre_value >= tmp) { // 如果上一个数字在进行加1计算的某一位为1
pre_value -= tmp; // 将上一个数字该位化为0(1+1=0)
tmp >>= 1; // 再将tmp向右移一位(将方便对次高位进行+1)
}
arr[i] = pre_value + tmp; // 对某位数字进行+1
}
// ---------/雷德算法-----------
// 打印出结果
print_array(arr, ARRAYSIZE);
}
自认为表述没有很清楚,但理解了雷德算法的过程后写出来的就是我上面那样,可能算是比较可读,不懂别人的代码为什么多了个判断啥的。