详谈内部排序之冒泡排序

冒泡排序


交换排序:

​ 两两比较待排序记录的关键码,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止 。

​ 交换排序的主要算法有:

​ (1) 冒泡排序

​ (2) 快速排序


冒泡排序基本思想:

​ 小的浮起,大的沉底

具体做法:

​ 第一趟:第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,… 关键字最大的记录交换到最后一个位置上;

​ 第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;

​ 依次类推,则完成排序。


冒泡排序的过程:

例:关键字序列 T=(25,56,49,78,11,65,41,36)进行升序排序

​ 请写出冒泡排序的具体实现过程。

初始状态第一趟第二趟第三趟第四趟第五趟第六趟
25252525111111
56494911252525
49561149413636
78115641364141
11654136494949
65413656565656
41366565656565
36787878787878

如图所示: 加粗斜体的数字为,已经排序完成的数字。

具体步骤:

​ 1) 第一趟中:
①首先比较(25 ,56),是小于关系,位置不变

结果为25,56,49,78,11,65,41,36

​ ②再次比较 (56,49),是大于关系,交换位置

结果为:25,49,56,78,11,65,41,36

​ ③比较 (56,78),是小于关系,位置不变

结果为:25,49,56,78,11,65,41,36

​ ④比较 (78,11),是大于关系,交换位置

结果为:25,49,56,11,78,65,41,36

​ ⑤比较 (78,65),是大于关系,交换位置

结果为:25,49,56,11,65,78,41,36

​ ⑥比较 (78,41),是大于关系,交换位置

结果为:25,49,56,11,65,41,78,36

​ ⑦比较 (78,36),是大于关系,交换位置

结果为:25,49,56,11,65,41,36,78


到第⑦步之后,就结束了一次循环。

可以看到,每次循环结束后,我们的最后的一个数就是这一组数据中最大的数。

这样要注意的是,最后一个数,不需要在进行之后的操作,所以在循环结束一次后,将外层的循环减1。

然后进行下一次循环,重复以上步骤,直到排序完成后退出循环,完成排序


冒泡排序主要算法描述

void Bubblesort(ElemType R[],int n) { 
    int flag=1;  //当flag为0则停止排序
    for  (int i=n; i>1; i--)  {  //i表示趟数,最多n-1趟
        flag=0;  //开始时元素未交换
        for (int j=2; j<=i; j++)  
           if (R[j]<R[j-1]) {    //发生逆序
               temp=R[j];   R[j]=R[j-1];  R[j-1]=temp; 
               flag=1;
           } 
        if(flag==0) return;    
    }
} // Bubblesort


冒泡排序算法分析:

正序:

​ 只需进行一趟排序,在排序过程中进行n-1次关键字间的比较,且不移动记录;时间复杂度为O(n) 。

逆序:

​ 需要进行n-1趟排序,需要进行n(n-1)/2次比较,并作等数量级的记录移动。总的时间复杂度为O(n^2) 。

​ 冒泡排序方法是稳定的,适合于数据较少的情况。


冒泡排序的性能分析:

时间效率:O(n^2)

空间效率: O(1)

算法的稳定性:稳定

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序是一种简单而经典的排序算法,在Verilog中实现冒泡排序的原理相对简单。下面是一种可能的实现方法: 首先,我们需要定义一个包含待排序的数据的数组。在Verilog中,我们可以使用reg类型的数组来表示。假设我们想要对一个包含n个元素的数组arr进行排序。 接下来,我们需要使用两个嵌套的for循环来遍历整个数组。外部循环控制每一轮的比较次数,而内部循环用于比较相邻的两个元素,如果它们的顺序不是按照升序排列的,则交换它们的位置。 最后,我们可以通过打印数组的元素来验证排序结果。以下是具体的Verilog代码实现: module bubble_sort; parameter n = 10; // 待排序数组的大小 reg [7:0] arr [n-1:0]; // 待排序数组 initial begin // 初始化待排序数组 arr = {1, 8, 4, 2, 9, 3, 7, 6, 5, 0}; // 开始冒泡排序 for (int i = 0; i < n; i = i + 1) begin for (int j = 0; j < n-1; j = j + 1) begin if (arr[j] > arr[j+1]) begin // 交换相邻元素的位置 reg [7:0] temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; end end end // 打印排序结果 $display("排序结果为:"); for (int i = 0; i < n; i = i + 1) begin $display(arr[i]); end end endmodule 上述代码中,我们首先定义了一个大小为10的数组arr,并初始化了其中的元素。然后使用两个for循环进行冒泡排序,并将排序结果打印输出。注意,在Verilog中,我们使用$display函数来输出结果。 以上就是使用Verilog实现冒泡排序的一个简单方法,运行代码后可以在仿真器中观察到排序结果。当然,还有其他更多的实现方式和优化策略,但以上所示的方法已经可以实现冒泡排序的基本功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值