冒泡排序
思路:相邻位比较,反序则互换
结论:
-
每一轮
比较后都会将最大值(最小值)放置在序列尾端,且这个值就已经有序 -
因为每轮都会产生一个有序值,所以
每一轮
比较与前一轮
比较相比都会少一次
比较 -
如果待排序序列长度为N,则一共要进行
N-1轮比较
-
假设冒泡排序的轮次从
第0轮开始计算
,那么第i轮
排序开始的时候,序列当中就有i个元 素是有序的
,本轮就会执行n-i-1次比较
代码实现:
public void sort(int[] array){
int tmp;
//外层要n-1层循环,array.length就是n,i < array.length - 1 就是n-1
for (int i = 0 ;i < array.length - 1 ; i++){
//内层循环每轮会少一个,因为每轮就排好了一个
for (int j = 0 ; j + 1 <= array.length-i-1 ; j ++ ){
if (array[j] > array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
冒泡排序的优化:
思路:
如果在执行冒泡排序的某一轮排序操作的过程当中,没有任何元素发生交换,则表示当前序列已 经是完全有序状态了,后续轮次的比较没有意义继续执行。我们可以定义一个boolean类型的临 时变量标记位,在每一轮排序开始之前置为false,表示尚且没有元素发生交换;如果在这一轮 当中有元素进行交换,则在交换之后将这个标记位置为true。在一轮排序结束之后,对标记位进 行判断:如果标记位取值依然为false,则表示可以直接退出排序算法。
public void sort2(int[] array){
int tmp;
boolean flag;
for (int i = 0 ;i < array.length - 1 ; i++){
flag = false; //判断每一轮是否有元素值交换
for (int j = 0 ; j + 1 <= array.length-1-i ; j ++ ){
if (array[j] > array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
flag = true;
}
}
if (!flag){ //如果没有元素交换,直接return(没有交换说明已经有序了)
return;
}
}
}