原理
比较两个相邻的元素,将值大的元素交换到右边
思路
冒泡排序类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。每一趟遍历,将一个最大的数移到序列末尾。
描述
比较相邻的元素,如果前一个比后一个大,则进行交换。
第一趟排序第1个和第2个进行比较与交换,随后第2个和第3个进行比较交换,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。
第二趟将第二大的数移动至倒数第二位,依此类推
…
因此整个排序过程需要n-1趟;
动图实现
代码实现
public static void main(String[] args) {
int[] arr = new int[]{65, 89, 12, 40, 8, 76, 53, 42, 19, 100, 86, 201, 97};
Bubblesort(arr);
}
/**
* @return void
* @Author Hxx
* @Description //TODO 冒泡排序
* @Date 9:30 2020/5/21
* @Param [arr]
**/
public static void Bubblesort(int[] arr) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
long endTime = System.currentTimeMillis();
for (int i = 0; i < arr.length - 1; i++) {
System.out.println(arr[i] + "\t");
}
//System.out.println("执行前系统毫秒值:" + startTime);
//System.out.println("执行后系统毫秒值:" + endTime);
//System.out.println("算法执行时间:" + (endTime - startTime));
}
}
算法分析
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
算法复杂度
时间复杂度: O(N^2)
空间复杂度: O(1)
稳定性:稳定