依次比较相邻的两个元素,若前者比后者大,则交换两个元素的位置,否则,则不交换。每比较完一轮,最后的那个数就是参与比较的数中最大的数字。
除去上一轮比较出来的那个最后的数,剩下的数再参与比较,同样的方法依次比较相邻的两个元素,得出参与比较的数中最大的数。…直到比较到最后一个数,比较完成。
最好的时间复杂度:O(n)
最坏的时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
假设数组中数据为 int[] arr={3,0,7,8,2}
第一轮循环:
( 第一次比较:3和0比较,交换位置): 0,3,7,8,2
( 第二次比较:3和7比较,不交换位置): 0,3,7,8,2
( 第三次比较:7和8比较,不交换位置): 0,3,7,8,2
( 第四次比较:8和2比较,交换位置): 0,3,7,2,8
至此,第一轮循环完成,得出8为最大数,接下来比较剩余的数:0,3,7,2
第二轮循环:
( 第一次比较:0和3比较,不交换位置): 0,3,7,2
( 第二次比较:3和7比较,不交换位置): 0,3,7,2
( 第三次比较:7和2比较,交换位置): 0,3,2,7
至此,第二轮循环完成,得出7为参与比较的数中的最大数,接下来比较剩余的数:0,3,2
第三轮循环:
( 第一次比较:0和3比较,不交换位置): 0,3,2
( 第二次比较:3和2比较,交换位置): 0,2,3
至此,第三轮循环完成,得出3为参与比较的数中的最大数,接下来比较剩余的数:0,2
第四轮循环:
( 第一次比较:0和2比较,不交换位置): 0,2
至此,第四轮循环完成,得出2为参与比较的数中的最大数
所以排序为0,2,3,7,8
public static void main(String[] args){
int[] arr={3,0,7,8,2};
//外层循环比较n-1次(n为数组长度)
//使用i--可以避免数组越界问题,且内层循环可以直接使用i
for (int i=arr.length-1;i>0 ;i-- )
{
//内层循环比较i次,i为每次参与比较的数字长度
for (int j=0;j<i ;j++ )
{
if (arr[j]>arr[j+1])
{
//定义一个临时变量交换位置
int temp;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//依次输出拍过序的数组元素
for (int i=0;i<arr.length ;i++ )
{
System.out.println(arr[i]);
}
}
0
2
3
7
8