前言
为了给自己关于算法部分·做一个系统的学习认知,同时也方便大家面试及工作,特此写这一部分的记录,记录自己的理解,一起学习,一起加油。
一、关于排序算法中的冒泡排序
百度概念:
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
理解概念:
冒泡排序是从第一个数据开始,依次进行两两比对,若前一个数据大于后一个数据,则将两个数据位置互换达到排序的目的,同时,每次的排序都可以大概的将数据进行简单的排序。
具体的过程可以查看关于排序的动态图
二、冒泡排序的实现步骤
1、将两个数的大小进行比较,符合要求进行位置互换.(将大的数据进行往后)
2、数据依次比较,往后开始进行比较(第一轮结束后,最大的数据就会排序到最后)
3、从头开始继续执行上述的步骤(开始排序第二大数据、第三大数据、、、)
4、依次执行n(数据的长度)次,循环执行上述步骤。
三、步骤拆分详解
第一步(代码实现)
方法分析:使用if条件进行判断,后续进行排序:
public class MPDemo01 {
public static void main(String[] args) {
//假设有一组待排序数据
int[] arr = {28,14,9,80,32,20};
//进行第一步操作
if (arr[0]>arr[1]){
int temp=arr[0];
arr[0]=arr[1];
arr[1]=temp;
}
//输出后的结果为:14,28,9,80,32,20
}
}
第二步(代码实现)
方法分析:
使用for循环对整体的数据进行循环比较,可以将最大的值排序到最后
import java.util.Arrays;
public class MPDemo02 {
public static void main(String[] args) {
//假设有一组待排序数据
int[] arr = {28,14,9,80,32,20};
//进行第一、第二步操作
for (int i = 0; i < arr.length-1; i++) {
if (arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
//最后的结果为:[14, 9, 28, 32, 20, 80]
}
}
可以看到数据中最大的80已经排序到最后
第三步:(代码实现)
方法分析:
需要再次从最开始进行循环遍历,还需要一个for循环来控制循环的次数
import java.util.Arrays;
public class MPDemo02 {
public static void main(String[] args) {
//假设有一组待排序数据
int[] arr = {28,14,9,80,32,20};
//进行第一、第二步操作
for (int i = 0; i < arr.length-1; i++) {
if (arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
//最后的结果为:[14, 9, 28, 32, 20, 80]
//进行第二次的循环,因为最后一个数据已经排序完成,所以这次的循环终止为 arr.length-2
for (int i = 0; i < arr.length-2; i++) {
if (arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
//最后的结果为:[9, 14, 28, 20, 32, 80]
}
}
经过上级步骤的循环可以发现,只需要定义一个二重的循环,对数据进行遍历,就可以完成整体数据的排序。
第四步:(代码实现)
方法分析:使用双层for对数据进行步骤控制即可完成排序
public class MPDemo03 {
public static void main(String[] args) {
//假设有一组待排序数据
int[] arr = {28,14,9,80,32,20};
//首先分析需要进行排序的次数:当最后只有一个数据的时候,不再需要排序
//故此,排序的次数为:arr.length-1
for (int i = 0; i < arr.length-1; i++) {
//分析内层需要进行排序的数据的个数:每次确定可以将一个最大的数据进行沉底,
//故此,当执行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;
}
}
}
//排序完成,最后的结果为:[9, 14, 20, 28, 32, 80]
}
}
次步骤完成后,冒泡排序基本实现。
四、冒泡分析算法分析:
时间复杂度分析:
当数据已经是排好序的时候,时间复杂度为:O(n)
当数据是顺序刚好是倒序的,此时,需要的时间复杂度最大,为:O(n^2)
上诉为极端情况,通常情况为:O(n^2)
算法稳定性分析:
判断一个算法是否稳定,主要是看当不同情况下使用该算法,数据每一步的位置是否发生改变,当两个数据大小相同时,多次进行比较后,是否会发生位置互换。
因为冒泡排序每次都是从头进行依次比较数据大小的,所以,位置并不会发生变化,故此:冒泡算法是稳定排序的算法
本次的理解就到这里了,欢迎大家一起共勉,加油!!!