冒泡排序:(默认升序,需要掌握知识)
- 双层循环(内外):
每次外层循环,会把后半段数组排好序
- 每次对比当前和下个数据的大小:所以内外层循环限制条件都是
length-1
;不需要遍历到最后一个数据,倒数第二个数据会和最后一个数据进行大小对比。 - 每次外层循环后,会安顿好最大的一个数字的位置(依次在数组尾部,过程形式水底的气泡上升过程变大…):所以内层循环限制条件
j<length-1-i
即可,不需要继续循环[length-i, length-1]
的数据,因为随着每一轮,尾部的大数值数据已经归位。 - 增加交换标识isSwap,如果内层没有交换,可以跳过外层的循环:
内层无交换说明已经排好顺序,可以提前结束循环
。 - isSwap 的判断必须在for循环判断条件上:
array.length-1 && isSwap
不能改成 for循环内层if(isSwap) {...}
的判断;可以思考一下?
public static void bubbleSort(int[] array) {
// 对应4
boolean isSwap = true;
for(int i=0; i<array.length-1 && isSwap; i++) {
// 对应4 默认每次不交换.
isSwap = false;
for (int j=0; j<array.length-1-i; j++) {
if(array[j] > array[j+1]){
swap(array, j, j+1);
// 对应4 交换后更新标识.
isSwap=true;
}
}
}
}
插入排序:(默认升序,需要掌握知识)
- 双层循环:
每次外层循环,会把前半段数组排好序
- 记录当前值:
current=array[i]
,比冒泡多用一个临时变量 - 内层循环对比当前值curr,并向后挪动数组,腾出合适位置。
- 内层for循环的判断条件必须是
j>=0 && array[j]>curr
,不能把数值比对,拿到for循环内部if(array[j]>curr){...}
;同样可以思考下?
public static void insertSort(int[] array) {
for(int i=1,j; i<array.length; i++) {
// 2. current
int curr = array[i];
// 3. 对比当前值curr 和前半段数组值,腾出合适位置.
for (j=i-1; j>=0 && array[j]>curr; j--) {
array[j+1] = array[j];
}
array[j+1] = curr;
}
}
ps:
下一篇有思考题解答:下一篇。