一、什么是冒泡排序
冒泡排序是一种(排序算法)交换排序,它的思路就是在输入数据中,通过比较相邻的两元素,看是否满足顺序的要求,若满足则保持不动,若不满足则让它们互换。然后继续与下一个相邻元素的比较,一直到一次遍历完成。一次遍历的过程就被成为一次冒泡,一次冒泡的结束至少会让一个元素移动到了正确的位置。所以要想让所有元素都排序好,一次冒泡还不行,我们需要重复N-1次去冒泡,这样最终就完成了N个数据的排序过程。
通过上面的描述,可以看出来冒泡排序在代码实现层面需要双层循环,哈哈哈。
二、算法流程
利用双层循环实现,外面循环变量为i,里面虚幻变量为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,…,2,1次。
假设数组长度为N。
1.比较相邻两个元素的大小,如果前面数据值大于后面数据值,将二者进行交换。
2.这样对数组的第0个数据(索引位置)到N-1个数据(索引位置)进行一次遍历后,最大的一个数据就变到数组第N-1个位置(索引位置)。
3.由于每次通过冒泡产生最大的元素并沉到末尾,因此在第二轮冒泡时循环次数减1,依次类推。
三、Java代码实现
由于Java不能够直接交换两个元素值的大小,因此这里需要申请一个临时变量temp。
测试样例: {-6,8,-2,0,9,-11,-15}
样例输出:-15,-11,-6,-2,0,8,9
public class HelloWorld {
public static void main(String []args) {
int[] arr = {-6,8,-2,0,9-11,-15};
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;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
}
四、Python代码实现
测试样例: [-2,-8,12,25,-7,0,10]
样例输出:[-8,-7,-2,0,10,12,25]
def maopao(ls) :
for i in range(0, len(ls)-1):
for j in range(0, len(ls)-i-1):
if ls[j] > ls[j+1]:
ls[j], ls[j + 1] = ls[j + 1], ls[j]
return ls
if __name__ == '__main__':
ls = [-2,-8,12,25,-7,0,10]
res = maopao(ls)
print(res)
五、复杂度分析
5.1时间复杂度分析
在完全有序的情况下,最好的时间复杂度是O(n),只需要1次冒泡。而在极端情况完全逆序,时间复杂度为O(n^2)。平均情况下时间复杂度是O(n²)。
5.2空间复杂度分析
空间复杂度为:O(1)。