您的位置:首页 > 理论基础 > 数据结构算法

冒泡排序的优化

2017-03-20 19:55 253 查看
基本思想:冒泡排序(默认是从小到大排序)是指在数组中,遍历0-n-1的元素数组,第一个数A与第二个数B进行对比,若A>B,则交换,否则,不交换。然后第二个数B与第三个数C进行对比,以此类推直到到处第二个元素与最后一个元素进行对比。这时,第一趟排序结束后,就将最大值 放在了数组的最后一位,然后遍历0到n-2的元素数组,以此类推。

方法:

冒泡(没优化):通过两层for循环实现。

public static void Bubble(int[] array) {
for(int i =0;i< array.length-1;i++) {
for(int j = 1;j < array.length-i;j++) {
if(array[j] < array[j-1]) {
swap(array,j,j-1);
}
}
}
}

冒泡优化一: ①设置整型flag初始化为数组长度;
②使用while遍历数组,循环条件flag>0,每次遍历,k = flag,flag = 0。
③数组循环直到k,到当发生交换时,将i赋值给flag。
④当flag不大于0时,代表数组中最多只有一个数组元素了,所以无法再次交换了。跳出,排序结束。

flag代表的是最后一次发生交换的位置,也就是说后面的已经不再需要交换,因为后面的都大于前面的所有数组元素。

public static void Bubble(int[] array){
int l = array.length;
int k;
int flag = l;

while(flag > 0) {
k = flag;
flag = 0;

for(int i = 1;i < k;i++) {
if(array[i] < array[i-1]) {
swap(array,i,i-1);
flag = i;
}

}
}

}

冒泡优化二:假设排序一共需要7趟,但是排序时可能第二趟就已经将数组排序好了,所以这时就不再需要继续下一趟了。这时我们可以加一个flag去标记不再发生交换的哪一趟(第三趟),这是一个优化的点。代码如下:

public static void Bubble(int[] array){
int l = array.length;
boolean flag = true;
while(flag) {
flag = false;
for(int i = 1; i <l;i++) {
if(array[i] < array[i -1]) {
swap(array,i,i-1);
flag = true;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息