Java排序算法之冒泡排序
交换类排序主要是通过两两比较待排元素的关键字,若发现与排序要求相逆,则“交换”
之。冒泡排序是交换类排序的一种。本篇文章讲解以下内容:
- 基本思想
- 源码
- 源码解析
- 算法原理
- 效率分析
冒泡排序的基本思想
基本处理思想是通过对相邻两个数据的比较及其交换来达到排序的目的。
首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止;
上述过程描述了起泡排序的第一趟排序过程,在第一趟排序过程中,我们将关键字最大的元素通过交换操作放到了具有 n 个元素的序列的最一个位置上。
然后进行第二趟排序,在第二趟排序过程中对元素序列的前 n-1 个元素进行相同操作,其结果是将关键字次大的元素通过交换放到第 n-1 个位置上。一般来说,第 i 趟排序是对元素序列的前 n-i+1 个元素进行排序,使得前 n-i+1 个元素中关键字最大的元素被放置到第 n-i+1 个位置上。排序共进行 n-1 趟,即可使得元素序列按关键字有序。
源码
package com.algorithm.sorting;
/**
* 冒泡排序
* @author Administrator
*
*/
public class BubbleSort {
public static void BubbleSort(int[] arr) {
System.out.print("要排序的数组:");
for (int a = 0; a < arr.length; a++) {
System.out.print(arr[a] + "\t");
}
System.out.println("");
int temp;// 临时变量
for (int i = 0; i < arr.length - 1; i++) { // 表示排序次数,一共arr.length-1次。
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
//"<",代表正序即从小到大;">"代表逆序即从大到小
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for (int a = 0; a < arr.length; a++) {
System.out.print(arr[a] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for (int a = 0; a < arr.length; a++) {
System.out.print(arr[a] + "\t");
}
}
public static void main(String[] args) {
int array[]={
100, 20, 30,-1,99,53};
BubbleSort(array);
}
}
源码解析
首先看正序的整个过程:
要排序的数组:100 20 30 -1 99 53
第1次排序结果:-1 100 20 30 53 99
第2次排序结果:-1 20 100 30 53 99
第3次排序结果:-1 20 30 100 53 99
第4次排序结果:-1 20 30 53 100 99
第5次排序结果:-1 20 30 53 99 100
最终排序结果:-1 20 30 53 99 100
再看逆序的整个过程:
要排序的数组:100 20 30 -1 99 53
第1次排序结果:100 99 20 30 -1 53
第2次排序结果:100 99 53 20 30 -1
第3次排序结果:100 99 53 30 20 -1
第4次排序结果:100 99 53 30 20 -1
第5次排序结果:100 99 53 30 20 -1
最终排序结果:100 99 53 30 20 -1
算法执行过程(正序):
- 比较相邻的两个数据,如果第二个数小,就交换位置。
- 从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。
- 继续重复上述过程,依次将第2.3…n-1个最小数排好位置。
算法原理
- 首先将第一个数据与第二个数据进行比较,如果是逆序(即arr[j]>arr[j+1)则交换之,然后比较第二个数据和第三个数据,依此类推,直到第n-1个数据和第n个数据进行过比较为止。上述过程称为冒泡排序的第一趟处理,第一趟处理的结果使得最大的数据被安置在最后一个元素的位置上。然后进行第二趟处理,即对前n-1个数据进行上述的处理,第二趟处理的结果是使次大的数据被安置在倒数第二个数据位置上。
- 一般地,冒泡排序的第i趟是从arr[0]到arr[n-i]依次比较相邻两个元素的关键字,并在逆序时交换相邻的数据,其结果是将这n-i+1个数据中最大的交换到n-i的位置上。整个排序过程需要进行n-1趟处理,第n-1趟处理使倒数第二的