冒泡排序算法的改进
前面说的传统的冒泡排序中每一趟排序只能找到一个最大值或最小值,效率低,基于这个缺点我们考虑利用在每一趟排序中进行正向和反向俩遍冒泡的方法一次可以得到俩个最终值(最大值和最小值),确定俩个值的位置,从而使排序趟数减少了一半。
初始顺序:49 38 65 97 76 13 27 49 按照从小到大冒泡
使用正向冒泡得到每趟循环的最大值。
使用反向冒泡得到每趟循环的最小值。
第一趟排序: 38 49 65 76 13 27 49 97
第一趟正向排序原理: 第一条记录49与第二条记录38比较 根据排序要求 49 下沉 38 上冒 数组变成(38 49 65 97 76 13 27 49),接着用第二条记录49与第三条记录65比较,根据排序要求 数组保持原样(38 49 65 97 76 13 27 49),以此类推第。直到把最大值下沉到逻辑上的最后一个位置。 第一趟排序的结果是(38 49 65 76 13 27 49 97)
第一趟反向排序原理:使用正向排好序的数组(38 49 65 76 13 27 49 97),最后一条记录97与它的前一个,根据排序要求小的上冒大的下沉,以此类推可以把最小值上冒到逻辑上的第一个位置(13 38 49 65 76 27 49 97)。
第二趟排序:13 27 38 49 65 49 76 97
第三趟排序:13 27 38 49 49 65 76 97
改进后的算法的代码实现。
@Test
public void testMaoPao(){
//定义待排序的数组 49,38,65,97,76,13,27,49
int a[] ={49,38,65,97,76,13,27,49};
//定义中间变量 用于俩个数字交换时的转换
int tmp;
for(int i = 0; i<a.length/2; i++){
//正向循环 把最大这下沉到 j+1的位置
for(int j = i;j<a.length-i-1; j++){
//前一个数大于后一个 下沉
if(a[j]>a[j+1]){
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
//反向循环 把最小者上冒的i的位置。
for(int j = a.length;j>i;j--){
// 后一个数比前一个数小 上冒
if(a[j]<a[j-1]){
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
System.out.println(Arrays.toString(a));
}