排序算法-冒泡排序
Posted 异次猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-冒泡排序相关的知识,希望对你有一定的参考价值。
冒泡排序
冒泡排序(Bubble Sort)是一种简单直观的排序算法;它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换(数列已经排序完成); 该算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端.
算法步骤
以从小到大排序的思路拆解算法步骤:
比较相邻的两个元素,如果第一个比第二个大就交换位置.
对每对相邻的元素进行比较,从开始第一队到结尾的最后一对,这样最后的元素就是最大的了.
每循环一次之后都会有一个最大的数在后面,每确定一个最大的数,那个数在最后面不动它,这是内循环.
每次循环确定最大得数沉到最底下,一共要循环数组的长度减一次,这是外循环.
算法复杂度
时间复杂度:O(n^2), 最优时间复杂度:O(n), 平均时间复杂度:O(n^2) 空间复杂度:O(1)
当输入的数据已经是正序时最快, 当输入的数据是反序时最慢
算法实现
冒泡排序
元素从小到大排列的算法实现
public static void bubble(int arr[]){
// 外循环,需要循环的次数
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 tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
冒泡排序
还有一种 优化算法
,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序.
public static void bubble(int arr[]){
// 外循环,需要循环的次数
for(int i=0; i < arr.length-1; i++){
boolean flag = true;
// 内循环,用于相邻位置上的数据比较,每次循环都能确定一个最大数在最后
for(int j=0; j < arr.length-1-i; j++){
if(arr[j] > arr[j + 1]){
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = false;
}
}
// 在一趟遍历中元素没有发生交换则,说明序列已经有序
if (flag) {
break;
}
}
}
数据示例
初始序列:95 27 90 49 80 58 6 9 18 50
第1趟: [6] 95 27 90 49 80 58 9 18 50
第2趟: [6 9] 95 27 90 49 80 58 18 50
第3趟: [6 9 18] 95 27 90 49 80 58 50
第4趟: [6 9 18 27] 95 90 49 80 58 50
第5趟: [6 9 18 27 49] 95 90 80 58 50
第6趟: [6 9 18 27 49 50] 95 90 80 58
第7趟: [6 9 18 27 49 50 58] 95 90 80
第8趟: [6 9 18 27 49 50 58 80] 95 90
第9趟: [6 9 18 27 49 50 58 80 90] 95
结 果: [6 9 18 27 49 50 58 80 90 95]
以上是关于排序算法-冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章