《Java数据结构与算法》中提到,排序是计算机科学中广泛研究的课题
引用书中的例子:
一列棒球运动员从低到高的身高进行站队
- 在现实生活中,人可以看到所有运动员的情况,最高的那个可以瞬间找出,而且毫不费力的测量和比较每个人的身高,可以不拘泥于空间,并在推推搡搡中前后让位地排好队列
- 计算机程序却不能向人一样总览所有信息,程序只能在不断的比较和交换、复制中去遵循简单的规则,直到所有数据有序为止
冒泡排序
冒泡排序是对上述程序规则较好的体现
- 比较两人身高
- 如果左边身高,高于右边则两人交换位置,否则保持不变
- 指针向右移动,继续拿下一个人进行比较
第一轮比较后就可以找出最高的那人并且让他站在队伍的最右边
这也形象的解释了为何此算法被称为冒泡排序的原因:
最大的数据总是被“冒泡”到数组的顶端
将上述操作比作内循环比较
那从左到右一趟可以比作一次外循环
当多次外循环操作时就可以达到将身高从矮到高排序,中间只需要注意将已排序的比较操作剔除就可以实现冒泡排序
代码实现
/**
* @author: DonHear
* @since: 2021-01-29 10:56
* @Description:
* @version: 1.0.0
*/
public class BubbleSor {
private long[] a;
//指针(索引)体现数组a中实际元素个数
private int nElems;
//构造函数:当对象初始化后,指针(索引)也随之初始化
public BubbleSor(int max){
a = new long[max];
nElems = 0;
}
/**
* 进行冒泡排序排序
*
* 注:这个冒泡方法是我根据书中理解一步步调试,从内循环向外写,将自己的理解体现出来
* 和书中给出的有所不同
* 书中的在执行上优于我写的
*/
public void sor(){
//空闲指引,用于元素交换时临时寄存
long c ;
//作为内循环次数指针,减少不必要的循环消耗(默认1是因为N-1次冒泡公式)
int k = 1;
//外循环(i=1是因为最后一次没必要执行,已经是最小的)