
1、冒泡排序的基础算法
冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。
算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
1) 如有一个数列有 N(5)个元素,则至多需要 N-1(4)趟循环才 能保证数列有序
2) 每一趟循环都从数列的第一个元素开始比较,依次比较相 邻的两个元素,比较到数列的最后
3) 如果前一个元素大于后一个元素,则使用第三变量交换
大家可以用如上思想,将下面的人按照身高从低到高重新排列:

import java.util.Arrays;
public class TestBubbleSort {
public static void main(String[] args) {
int[] values = {75,87,56,45,49};
System.out.println("排序前:" + Arrays.toString(values));
bubbleSort(values);
System.out.println("排序后:" + Arrays.toString(values));
}
public static void bubbleSort(int[] values) {
for (int i = 0; i < values.length-1; i++) {//比较得轮数
for (int j = 0; j < values.length-1; j++) {
//相邻两数进行比较
if(values[j] > values[j+1]) {
//第三变量交换位置
int temp = values[j];
values[j] = values[j+1];
values[j+1] = temp;
}
}
}
}
}

运行结果:

2、冒泡排序的优化算法
其实,我们可以冒泡排序的算法优化一下,基于冒泡排序的以下特点进行优化:
1.整个数列分成两部分:前面是无序数列,后面是有序数列。初始状态下,整个数列都是无序的,有序数列是空。每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。
2.不管是否有序,都要进行 N-1 趟循环?判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较。定义一个 boolean 类型的变量 flag,默认有序 true;发生交 换,置为 false,一趟循环结束后,根据 flag 的值判断是否有序。有序,则退出循环。
http://3.int temp 每次比较的时候都要给 temp 分配空间,比较完 毕后翻放空间所有的比较都使用一个 temp 变量,同一个空间,将 temp 变量提取到大循环外 。

import java.util.Arrays;
public class TestBubbleSort2 {
public static void main(String[] args) {
// int[] values = {75,87,56,45,49};
int[] values = {1,2,3,4,5};
System.out.println("排序前:" + Arrays.toString(values));
int count = bubbleSort(values);
System.out.println("排序后:" + Arrays.toString(values));
System.out.println("共比较了" + count + "轮");
}
public static int bubbleSort(int[] values) {
boolean flag;//标记数组是否已达到有序状态
int temp;//第三变量初始化一次节约空间
int count = 0;//统计比较的轮数
for (int i = 0; i < values.length-1; i++) {//比较的轮数
flag = true;//默认有序
count++;
//只需比较无序部分即可
for (int j = 0; j < values.length-1-i; j++) {
//相邻两数进行比较
if(values[j] > values[j+1]) {
//第三变量交换位置
temp = values[j];
values[j] = values[j+1];
values[j+1] = temp;
//本趟发生了交换,表明该数组在本趟处于无序状态
flag = false;
}
}
if(flag) {
break;//退出循环,证明数组有序
}
}
return count;
}
}
尚学堂百战程序员
百战程序员_IT6000集_影响6000万学习IT的中国人【官网】