Verilog/C++实现排序算法
1、冒泡排序算法
冒泡排序是一种简单的交换类排序。
冒泡排序算法的原理如下:
- 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 3、针对所有的元素重复以上的步骤,除了最后一个。
- 4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.1、C++实现代码如下:
//交换 a 和 b 的位置
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序实现函数,从输出结果,可以看到冒泡的具体实现流程
void BubSort_test(int *a, int N)
{
for (int i = 0; i < N; i++)
{
//对待排序序列进行冒泡排序
for (int j = 0; j + 1 < N - i; j++)
{
//相邻元素进行比较,当顺序不正确时,交换位置
if (a[j] > a[j + 1])
{
swap(&a[j], &a[j + 1]);
}
}
/*///-------输出本轮冒泡排序之后的序列----------
printf("第%d轮冒泡排序:", i + 1);
for (int i = 0; i < N; i++)
{
printf("%d ", a[i]);
}
printf("\n");
-------输出本轮冒泡排序之后的序列----------///*/
}
}
1.2、Verilog实现代码如下:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
2、选择排序算法
选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
选择排序法是在要排序的一组数中,选出最小(或最大)的一个数与第一个位置的数交换;在剩下的数当中找最小的与第二个位置的数交换,即顺序放在已排好序的数列的最后,如此循环,直到全部数据元素排完为止。
2.1、C++实现代码如下:
2.2、Verilog实现代码如下:
选择排序法和冒泡法属于传统的两两比较的算法,但是消耗的周期比较长,在一些对实时性要求较高的情况下无法满足要求。
3、并行全比较排序法
传统的排序方式是以两两之间顺序比较为基础,而并行全比较实时排序算法是基于序列中任意两个数并行比较实现。由于从原来的串行比较变成了并行比较,所以需要消耗比以前多的比较器,诠释了FPGA中 “用面积换速度” 的思想。
并行全比较算法就是一种以FPGA的资源换取排序时间的算法。
- 1、第一个时钟周期:将其中一个数据和其他数据在一个周期中一一比较,比较器分三种情况:
- 1.1、这个数据大于其他数据,则它的得分为0;
- 1.2、这个数据等于其他数据,若它在这个序列中比和它相等的其他数据靠前,则它的得分为0,反之为1;
- 1.3、这个数据小于其他数据,则它的得分为1;
- 2、第二个时钟周期:将每个数据和其他数据比较后的数据累加;
- 3、第三个时钟周期:将每个数据根据自己的得分赋值给新的数组(若得分为1的就赋值给数组中的第一个数,2就赋值给新的数组中第二个数);
- 4、第四个时钟周期:将新数组输出;
经过以上四个步骤,即可将算法完成。
3.1、C++实现代码如下:
3.2、Verilog实现代码如下:
- 优点:并行比较排序方式在实时性上有明显的优势,只需要四个时钟周期就可以排序完成;
- 缺点:
- 1.由于是并行比较消耗了较多的资源,而且在第二个时钟周期(得分累加)需要大量的加法器级联,考虑到路径延迟、建立保持时间和时钟抖动,一个时钟周期许多个加法器级联会有问题;
- 2.在代码可移植性方面也有欠缺,比如若序列大小改变,在第二个和第三个时钟周期的时候就需要人为修改多处代码;
4、串行全比较排序法
串行全比较排序法在并行全比较排序法做了一些改进,将原来并行全比较排序法的前三个周期由并行转变为串行,但是可以在比较的同时将得分累加,所以串行全比较排序法排序需要的周期是2*m(m个序列)个周期。
4.1、C++实现代码如下:
4.2、Verilog实现代码如下:
串行全比较算法和并行全比较算法比较:
- 优点:
- 1、资源消耗的比较少;
- 2、代码可移植性好,序列变化只需要改变几个参数,不需要大规模修改代码;
- 缺点:串行全比较算法所消耗的时间比并行全比较算法长。
总结
- 代码可移植性:传统串行排序算法>串行全比较排序法>并行全比较排序法
- 资源使用:传统串行排序算法<串行全比较排序法<并行全比较排序法
- l排序时间:并行全比较排序法<串行全比较排序法<传统串行排序算法