冒泡排序
设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的”最前面”。
分析
以下是我写的冒泡排序的例子,对一个数组进行从小到大的排列。通过例子可以很清晰的看出冒泡排序的原理。
@Test
public void maopao(){
int []arr = {5,4,8,9,1,7,2,6,0,3};
int flag;
for (int j = 0; j <= arr.length-1 ; j++) { // j = 0
for (int k = 0; k <arr.length-j-1 ; k++) { k = 0,1,2,3,4,5,6,7,8
if(arr[k+1]<arr[k]){
flag = arr[k];
arr[k] = arr[k+1];
arr[k+1] = flag;
}
}
}
System.out.println(Arrays.toString(arr));
}
我说一下对这个方法的理解:
首先,要对数组从小到大的排序,我们应该想到,数组中的最大的元素往后移动,然后最终排序完成的数组为:
int []arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
例子中,第一个for循环是遍历数组,第二个for是为了判断大小,并移动数组中元素的位置。
当j=0时,第二次for遍历9次,也就是说arr.length-1 <arr.length-j-1 这个条件不满足是结束循环。
当k= 0时,k<9 满足遍历条件,if(4<5){ 所以需要改变数组元素的位置,我定义了临时变量flag ,首先把5赋值为flag,然后把数组中的第二个元素用第一个元素替换,此时,数组中第一个元素为4,第二个元素也为4,再将我们赋值的临时变量的值赋值给数组中的第二个元素,此时的数组改变为 int []arr = {4,5,8,9,1,7,2,6,0,3};
…
当j=1时,第二次for遍历8次,同上,将数组中的相邻元素比较,最大的向后移动。