冒泡排序简介
冒泡排序是一个简单易上手的排序方法。其工作原理和它的名字一样,“冒泡”顾名思义像水中的气泡一样,起初在最底层,一层一层往水平面上移动。说白了就是以一个基准元素和它左右两边的元素做比较,比它小则保持原位置不动,比它大就交换位置,直至把最大的一个元素放在最末端位置。下面拿一个例子来讲解:
现在有一个无序数组,要对其进行从小到大的顺序排序:
原数组:10,1,35,61,89,36,55
首先拿最左边的元素“10”开始比较,10>1,两个元素交换位置,再拿较大的那个(10)和其右边的35开始比较,10<35位置不变,再拿较大的那个(35)和其右边61比较,35<61位置不变,再拿61和89比较,61<89位置不变,再拿89和36比较,89>36交换位置,89和55比较,89>55交换位置,一趟比较完毕
第一趟排序:1,10,35,61,36,55,89 (比较了6次,把最大的89推到最右边)
第二趟排序:1,10,35,36,55,61,89(比较了5次,把最大的61推到其次)
第三趟排序:1,10,35,36,55,61,89(比较了4次,把最大的55推到其次)
第四趟排序:1,10,35,36,55,61,89(比较了3次,把最大的36推到其次)
第五趟排序:1,10,35,36,55,61,89(比较了2次,把最大的35推到其次)
第六趟排序:1,10,35,36,55,61,89(比较了1次,把最大的10推到其次)
要通过代码实现以上排序,代码如下:
public class Test {
public static void sort(int[] arrary) {
int i, j;
for (i = 0; i < arrary.length; i++) {// 这是要比较的趟数
for (j = 1; j < arrary.length - i; j++) {
if (arrary[j - 1] > arrary[j]) {// 若前一个元素大于后一个元素,交换位置
int th;
th = arrary[j - 1];
arrary[j - 1] = arrary[j];
arrary[j] = th;
}
}
}
}
// 来测试一下
public static void main(String[] args) {
int[] arrary = { 10, 1, 35, 61, 89, 36, 55 };
Test.sort(arrary);// 因为sort()是static修饰,所以只需要通过类名调用即可
for (int i : arrary) {// 遍历出数组
System.out.print(i + ",");
}
}
}
运行结果如下:
改良版冒泡排序:用于一部分元素已经有顺序,减少排序的复杂性
//改良版冒泡排序,适用于如果一个数组中有一部分已经排好序了的情况
public class NewSort {
public static void sort(int[] a) {
int i,j=a.length;
boolean flag = true;//设置一个标志,如果这一趟发生了交换就设置为true,如果没交换就是FALSE,如果没有交换就说明已经排序了
while(flag) {
flag =false;//在开始排序之前,假设都没有排序
for (i = 1; i<j; i++) {
if (a[i-1]>a[i]) {//这是升序,如果前面数字大于后面数字就交换
int th;
th = a[i-1];
a[i-1]=a[i];
a[i]=th;
flag = true;//表示已经交换过
}
}
j--;//减小一次排序的尾边界
}
}
public static void main(String[] args) {
int[] a= {2,5,1,5,6};
NewSort.sort(a);
for(int i:a) {
System.out.print(i+",");
}
}
}
运行结果如下:
以上是本人初步理解,如果有不足还希望各位大牛指出更正。