冒泡排序
假设现在有一组数据:Integer[] a={4,6,3,5,1}要将其从小到大进行排序。
冒泡排序的思想:
第一趟排序:
第一个数据和第二个数据进行比较,如果第一个数据大于第二个数据则进行交换,否则不变。 第二个数据和第三个数据进行比较,如果第二个数据大于第三个数据则进行交换,否则不变。 。。。 倒数第二个数据和最后一个数据进行比较,如果倒数第二个数据大于最后一个数据则交换,否则不变。 此时已经完成了一趟排序,此时数组的最后一个元素是最大的。
接下来进行第二趟排序: 第一个数据和第二个数据进行比较,如果第一个数据大于第二个数据则进行交换,否则不变。 第二个数据和第三个数据进行比较,如果第二个数据大于第三个数据则进行交换,否则不变。 。。。 倒数第二个数据和最后一个数据进行比较,如果倒数第二个数据大于最后一个数据则交换,否则不变。 此时完成了第二趟排序。
第三趟排序: 第一个数据和第二个数据进行比较,如果第一个数据大于第二个数据则进行交换,否则不变。 第二个数据和第三个数据进行比较,如果第二个数据大于第三个数据则进行交换,否则不变。 第三个数据和第四个数据进行比较,如果第三个数据大于第四个数据则进行交换,否则不变。 。。。 倒数第二个数据和最后一个数据进行比较,如果倒数第二个数据大于最后一个数据则交换,否则不变。 此时完成了第三趟排序。
第四趟排序: 第一个数据和第二个数据进行比较,如果第一个数据大于第二个数据则进行交换,否则不变。 第二个数据和第三个数据进行比较,如果第二个数据大于第三个数据则进行交换,否则不变。 第三个数据和第四个数据进行比较,如果第三个数据大于第四个数据则进行交换,否则不变。 。。。 倒数第二个数据和最后一个数据进行比较,如果倒数第二个数据大于最后一个数据则交换,否则不变。 此时全部数据已经有序。
我们一共进行了四趟排序。 由此我们可以用Java代码来实现冒泡排序:
public static void sort(Comparable[] a) {
//外层循环是循环的趟数,也就是进行了几趟排序
for (int i = a.length - 1; i > 0; i--) {
//内层循环,从数组的第一个元素开始和下一个元素进行比较,如果大于就交换
for (int j = 0; j < i; j++) {
if (greater(a[j], a[j + 1])) {
exch(a, j, j + 1);
}
}
}
}
//比较方法,如果数组中的a[v]>a[w]则返回真
private static boolean greater(Comparable v, Comparable w) {
return v.compareTo(w) > 0;
}
//交换方法
private static void exch(Comparable[] a, int i, int j) {
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
测试用例:
public static void main(String[] args)
{
Integer a[]={4,6,3,5,1};
Bubble.sort(a);
System.out.println(Arrays.toString(a));
}
执行结果:
|