冒泡排序作为排序算法中很经典也相对简单的算法,学编程的一定都会接触,在最近的学习中对冒泡排序有更深入的理解,特此记录。
例题:要求将数组{3, 7, 2, -13, 19, 8}通过冒泡排序算法由小到大排序。
冒泡排序:比较相邻的两个元素,step1:(1)从第一个数开始和第二个数比较,若第二个数比第一个大,则保持不变,若第一个数较大,则这两个数交换位置。
(2)同理,让第二个数和第三个数比较
...
(n - 1)让第n-1个数和第n个数比较
当step1比较结束后,此时数组的最后一个值一定为数组最大的一个值
step2:继续以step1的规则进行比较,需要注意的是此时最后一个数是不需要进行排序的,因为已经是最大的了。
...
step(n-1):都效仿step2
以第一次循环为例说明比较过程,3和7比7大所以保持不变,7和2比,7大所以2和7交换,7再和-13比,7大继续交换,7和19比19大保持不变,19和8比,19大交换如下所示:
可以发现一个规律,循环的次数 = 数组的长度 - 1;比较的次数 = 数组的长度 - 1 - 第n次循环的n值。
最后附上python、java的实现
python:
import os
class SortPort():
def __init__(self):
pass
def bubblesort(self, lis):
for j in range(len(lis) - 1): # 完整的一次排序需要的次数
for i in range(len(lis) - j - 1): # 每一次排序具体的交换次数
if lis[i] > lis[i + 1]:
lis[i], lis[i + 1] = lis[i + 1], lis[i]
print(l)
return l
if __name__ == '__main__':
l = [3, 7, 2, -13, 19, 8]
A = SortPort()
A.bubblesort(l)
Java:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[]{3, 7, 2, -13, 19, 8};
//冒泡排序
//n个元素的数组就需要进行n-1大轮的排序
for (int i = 0;i < arr.length - 1;i++){
/*每一大轮的循环需要进行的次数(第一大轮结束以后,最后一个数一定为最大的值,
所以第二大轮排序时则不用管最后一个值,第二大轮结束以后同理倒数第二个数是除了最后一个数以外的最大值)
*/
for (int j = 0;j < arr.length - i -1;j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
未经许可,禁止转载!