交换排序-冒泡排序(详情讲解)

1.0 概述

  • 交换排序的基本思想是两两比较待排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。

  • 交换排序主要方法(这一次主要讲解冒泡排序):

    • 冒泡排序

    • 快速排

2.0冒泡排序

  1.  概述     
  • 冒泡排序:Bubble Sort

  • 将待排序的数组看成从上到下的存放,把关键字较小的记录看成==较轻的==,关键字较大的记录看成==较重的==,

  • 关键字值的记录,好像水中的气泡一样,向浮;

  • 关键字值的记录,好像水中的石块一样,向沉;

  • 当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。

      2.1 示意图(方便更加容易理解)      

 

        2.2 算法分析

  • 从第一个记录开始,依次对无序区中相邻记录进行关键字比较,如果大在上,小在下,则交换,第一趟扫描下来表中最大的沉在最下面

  • 然后再对前n-1个记录进行冒泡排序,直到排序成功为止。

  • 一般,第i趟扫描时,r[0]到r[n-i]和r[i+1]到r[n-1]分别为当前的无序区和有序区。

  •   例如拿 {52,39,67,95,70,8,25,52} 做例子

 

2.3算法:标准版

public void bubbleSort() {
    RecordNode temp;
    for(int i = 1 ; i < this.curlen; i ++) { //每一趟需要处理好一个数据
        for(int j = 0; j < this.curlen - i ; j ++) {	//处理到无效序列的倒数第二位
            if(r[j].key.compareTo(r[j+1].key) > 0) {	//交换相邻的2个元素
                temp = r[j];
                r[j] = r[j+1];
                r[j + 1] = temp;
            } 
        }
    }
}

2.4算法:优化版【重点

//【算法优化】 冒泡排序算法
public void bubbleSort() {
//    System.out.println("冒泡排序");
    RecordNode temp;                                    // 辅助结点
    boolean flag = true;                                // 是否交换的标记
    for (int i = 1; i < this.curlen && flag; i++) {   // 有交换时再进行下一趟,最多n-1趟
        flag = false;                                   // 假定元素未交换
        for (int j = 0; j < this.curlen - i; j++) {     // 一次比较、交换
            if (r[j].key.compareTo(r[j + 1].key) > 0) { // 逆序时,交换
                temp = r[j];
                r[j] = r[j + 1];
                r[j + 1] = temp;
                flag = true;							//如果发生交换,记录
            }
        }
        System.out.print("第" + i + "趟: ");
        display();
    }
}

3.0        测试

  public static void main(String[] args) throws Exception {
        int[] arr = {52,39,67,95,70,8,25,52};
        SeqList seqList = new SeqList(arr.length);
        for (int i = 0; i < arr.length; i++) {
            seqList.insert(i, new RecordNode(arr[i]));
        }
        // 希尔排序算法
        seqList.bubbleSort();
    }
//冒泡排序
//第1趟:  39 52 67 70  8 25 52 95
//第2趟:  39 52 67  8 25 52 70 95
//第3趟:  39 52  8 25 52 67 70 95
//第4趟:  39  8 25 52 52 67 70 95
//第5趟:   8 25 39 52 52 67 70 95
//第6趟:   8 25 39 52 52 67 70 95

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值