冒泡排序java实现
冒泡核心就是两层for。
冒泡就是从数组的第一位开始比较大的放后面,小的放前面(从小到大排序),所以每一次循环结束,总是数组中最大的,在最后面。外层的for循环,就是将内层每次最大的数排除在外。下面是简单的java实现。
public class BubbleSort {
public static void main(String[] args) {
double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
BSort sort = new BSort(density);
sort.show();
sort.sort();
sort.show();
}
}
class BSort {
private double[] density;
private double temp = 0;
BSort(double[] density) {
this.density = density;
}
public void sort() {
int j;
for(int i=density.length-1; i>=0; i--) {
for(j=0; j<i; j++) {
if (density[j+1] < density[j]) {
temp = density[j];
density[j] = density[j+1];
density[j+1] = temp;
}
}
}
}
public void show() {
for(int i=0; i<density.length; i++) {
System.out.print(density[i] + " ");
}
System.out.println(" ");
}
}
第一次改进
下面是第一次改进的代码(改进的:当数组排序完成则结束排序,即跳出for),下面注释掉的是计算程序运行时间的,可惜每个程序的运行时间都太短了,每次输出都是0ms。
public class ImprovedBubbleSort {
public static void main(String[] args) {
double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
BSort sort = new BSort(density);
sort.show();
// long begin = System.currentTimeMillis();
sort.sort();
// long end = System.currentTimeMillis();
// long spendTime = end - begin;
sort.show();
// System.out.println("程序的开始时间为:"+begin+" 程序的结束时间为" + end+ " 程序运行时间为:" + spendTime);
}
}
class Sort {
private double[] density;
private double temp = 0;
boolean flag = false; //标记,如果内部的循环没用没用交换,则数组已排序完成
Sort(double[] density) {
this.density = density;
}
public void sort() {
int j;
for(int i=density.length-1; i>=0; i--) {
for(j=0; j<i; j++) {
if(density[j+1] < density[j]) {
flag = true;
temp = density[j];
density[j] = density[j+1];
density[j+1] = temp;
}
}
if(flag) {
break;
}
}
}
public void show() {
for(int i=0; i<density.length; i++) {
System.out.print(density[i] + " ");
}
System.out.println(" ");
}
}
第二次改进
第二次改进:需定义变量lastExchange表示上次循环中最后一次交换的位置。冒泡排序最后一次交换位置后面的区域是有序且全部大于前面区域的,所以排序时需要排除掉这些,但是在外层循环中修改i–有困难,所以就修改内层循环的判断条件,将j < <script type="math/tex" id="MathJax-Element-3"><</script>i改为j < <script type="math/tex" id="MathJax-Element-4"><</script>lastExchange即可。下面是java的实现:
public class SecondImprovedBubbleSort {
public static void main(String[] args) {
double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
BSort sort = new BSort(density);
sort.show();
sort.sort();
sort.show();
}
}
class SISort {
private double[] density;
private double temp = 0;
private boolean flag = false; //标记,如果内部的循环没用没用交换,则数组已排序完成
private int lastSwap = density.length-1; //标记最后一次交换的位置,此位置之后的全为有序且大于之前,所以排除在下次排序之外
SISort(double[] density) {
this.density = density;
}
public void sort() {
int j;
for(int i=density.length-1; i>=0; i--) {
for(j=0; j<lastSwap; j++) {
if(density[j+1] < density[j]) {
flag = true;
temp = density[j];
density[j] = density[j+1];
density[j+1] = temp;
lastSwap = j;
}
}
if(flag) {
break;
}
}
}
public void show() {
for(int i=0; i<density.length; i++) {
System.out.print(density[i] + " ");
}
System.out.println(" ");
}
}