冒泡排序法--(单个for循环实现)

一.什么叫冒泡排序法?

 比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置,然后继续往下找

二.两种冒泡排序法步骤:

对下列数组进行排序:(22,3,6,54,86,21,35,1,65,4)

1.普通的冒泡排序法:
实现步骤:

1:双层for循环嵌套;
2.判断条件如果满足,交换两数位置;


public class BubbleSort {
    public static void main(String[] args) {

        int a[]={22,3,6,54,86,21,35,1,65,4};

        for(int i= 0 ;i<a.length;i++){    //第一层循环
            for(int j=0;j<a.length-i-1;j++){    //第二层循环
                if(a[j]>a[j+1]){  
                                  //交换位置
                    int tem =a[j];
                    a[j]=a[j+1];
                    a[j+1]=tem;
                }
            }
        }
        System.out.println("排好序:");
        for(int aa:a){
            System.out.print(aa+" ");
        }
    }

}
结果展示:

双层for循环实现冒泡排序法

2.单个for循环实现冒泡排序法:
   a.)定义待排序数组及数组相关长度
  int a[]={22,3,6,54,86,21,35,1,65,4};
  int team=a.length-1;
b.)排序实现:

######1.单个for循环;

2. 判断是否应该交换位置;
for(int i= 0 ;i<team;i++){
        if(a[i]>a[i+1]){
        int tem =a[i];
        a[i]=a[i+1];
        a[i+1]=tem;
        }
}   
3. 判断该趟for循环是否结束;
4. 若该趟for循环结束将给i赋值-1,并且将team的长度减1,继续下趟循环;
if(i==team-1){
            i=-1;
            team--;
}
c.)完整程序:

//单个for循环的冒泡排序法
public class BubbleSort {
    public static void main(String[] args) {

    int a[]={22,3,6,54,86,21,35,1,65,4};
    int team=a.length-1;
    for(int i= 0 ;i<team;i++){
        if(a[i]>a[i+1]){
        int tem =a[i];
        a[i]=a[i+1];
        a[i+1]=tem;
        }
        if(i==team-1){
            i=-1;
            team--;
        }
    }

    System.out.println("排好序:");
    for(int aa:a){
        System.out.print(aa+" ");
    }
    }
}
结果展示:

单个for循环实现冒泡排序

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是两个模块的代码及测试模型: 第一种用纯组合逻辑实现的模块: ``` module BubbleSort_comb( input [31:0] data_in, // 4个8位输入数据 output reg [31:0] data_out // 排序后的输出数据 ); reg [7:0] temp[0:3]; // 临时变量,存储每个输入数据 reg [1:0] i, j; // 循环计数器 reg flag; // 标志位,记录是否已完成冒泡排序 always @(*) begin for (i = 0; i < 3; i = i + 1) begin temp[i] = data_in[(i+1)*8 - 1 : i*8]; end flag = 0; for (i = 0; i < 3; i = i + 1) begin for (j = 0; j < 3-i; j = j + 1) begin if (temp[j] > temp[j+1]) begin flag = 1; temp[j] = temp[j] + temp[j+1]; temp[j+1] = temp[j] - temp[j+1]; temp[j] = temp[j] - temp[j+1]; end end if (flag == 0) begin break; end end data_out = {temp[0], temp[1], temp[2], temp[3]}; end endmodule ``` 第二种假设8位数据是按照时钟节拍串行输入的模块: ``` module BubbleSort_clk( input clk, // 时钟信号 input [7:0] data_in, // 单个8位输入数据 input start, // 排序开始信号 output reg [31:0] data_out, // 排序后的输出数据 output reg done // 排序完成信号 ); reg [7:0] temp[0:3]; // 临时变量,存储每个输入数据 reg [1:0] i, j; // 循环计数器 reg [7:0] key; // 插入排序中的关键字 reg [1:0] index; // 插入排序中的插入位置 reg [1:0] count; // 记录已经输入的数据个数 always @(posedge clk) begin if (start) begin temp[0] = data_in; for (i = 1; i < 4; i = i + 1) begin temp[i] = data_in; for (j = i-1; j >= 0; j = j - 1) begin if (temp[j] > temp[j+1]) begin key = temp[j+1]; temp[j+1] = temp[j]; temp[j] = key; end end end data_out = {temp[0], temp[1], temp[2], temp[3]}; done = 1; end else begin if (count < 4) begin temp[count] = data_in; key = temp[count]; index = count; for (i = count-1; i >= 0; i = i - 1) begin if (temp[i] > key) begin temp[i+1] = temp[i]; index = i; end else begin break; end end temp[index] = key; count = count + 1; end else begin data_out = {temp[0], temp[1], temp[2], temp[3]}; done = 1; end end end endmodule ``` 测试模型的代码如下: ``` module BubbleSort_test; reg clk; reg [7:0] data_in; reg start; wire [31:0] data_out_comb; wire done_comb; wire [31:0] data_out_clk; wire done_clk; BubbleSort_comb u1( .data_in({data_in, data_in, data_in, data_in}), .data_out(data_out_comb) ); BubbleSort_clk u2( .clk(clk), .data_in(data_in), .start(start), .data_out(data_out_clk), .done(done_clk) ); initial begin clk = 1; forever #5 clk = ~clk; end initial begin data_in = 8'b10101010; #20 start = 1; #100 start = 0; #20 data_in = 8'b01010101; #20 data_in = 8'b11000011; #20 data_in = 8'b00110011; #20 data_in = 8'b11111100; #200 $finish; end endmodule ``` 在测试模型中,每20个时钟周期,输入一个8位数据,并在第100个时钟周期开始排序。可以通过仿真验证两种方法的正确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值