首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒泡排序实现来排序数组。效果如何?

冒泡排序实现来排序数组。效果如何?
EN

Stack Overflow用户
提问于 2011-12-31 21:48:17
回答 4查看 996关注 0票数 0

我使用一种算法对数组进行排序,当我在书中阅读时。我编写的算法有一个名为(冒泡排序)。我在想,我编写的程序是否完美地实现了冒泡排序算法,还是有更有效的方法来实现同样的操作?

代码语言:javascript
复制
import java.util.Arrays;
public class Tool {
    public static void main(String[] args){

        int[] n = {4,8,12,87,32,98,12,45,94,42,938,84,63,67,86,37};
        int inter = 0;

        int arrayLength = n.length;

        int pass = arrayLength-1;
        for(int y = 0; y < arrayLength - 1; y++) {
            for(int x = 0; x < pass; x++) {
                if(n[x] < n[x + 1]) {
                    inter = n[x];
                    n[x] = n[x + 1];
                    n[x + 1] = inter;
                    num++;
                }

            }
            pass--;
        }
        // To print the resulting array
        System.out.println(Arrays.toString(n));
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-31 22:04:49

http://www.algolist.com是一个寻找算法实现的好网站。您可以找到关于冒泡排序这里的文章。

看起来,您的代码缺少一个检查是否真的需要交换的优化(正如Loki所指出的)。

这段代码摘自上面的URL,该URL实现了这个优化:

代码语言:javascript
复制
public void bubbleSort(int[] arr){
    boolean swapped = true;
    int j = 0;
    int tmp;
    while(swapped){
        swapped = false;
        j++;
        for(int i = 0; i < arr.length - j; i++){
            if(arr[i] > arr[i + 1]){
                tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
                swapped = true;
            }
        }
    }
}

你可以从那一页读到更多关于它的信息,如果你是一个视觉学习者(就像我一样),它也有一些有用的图表。

干杯

票数 1
EN

Stack Overflow用户

发布于 2011-12-31 22:05:33

严格地说,这不是一种实现气泡排序的算法。它是泡泡排序的一个改进版本的实现,但是它没有正确地实现。

该实现使用的事实是,已知最后一项在第一次传递后处于正确位置,因此下一次传递可以对少一个项进行排序。最初的冒泡排序算法总是循环遍历所有的项目。

缺少的是该算法不检查什么时候不再进行掉期,而是一直循环,直到达到在最坏情况下可能需要的最大迭代次数为止。这意味着,它通常会在所有事情都已经解决后很长一段时间内保持循环。有一个变量num似乎就是用于这个目的的,但是有一些错误,因为该变量在任何地方都没有声明。

您应该在内部循环之前将num初始化为零,并在遍历项后循环直到它仍然为零为止:

代码语言:javascript
复制
import java.util.Arrays;
public class Tool {

  public static void main(String[] args){

    int[] n={4,8,12,87,32,98,12,45,94,42,938,84,63,67,86,37};

    int pass = n.length - 1;
    int num;
    do {
      num = 0;

      for(int x = 0; x < pass; x++){
        if(n[x] < n[x + 1]){
          int temp = n[x];
          n[x] = n[x + 1];
          n[x + 1] = temp
          num++;
        }

      }
      pass--;

    } while (num != 0);
    // To print the resulting array
    System.out.println(Arrays.toString(n));

  }
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-31 21:56:46

看见。

Bubble sort,也称为sinking sort,是一种简单的排序算法,它通过反复遍历要排序的列表,比较每一对相邻的项目,如果它们的顺序不对,就交换它们。遍历列表将被重复,直到不需要交换,这表明列表已被排序。该算法从较小的元素“冒泡”到列表顶部的方式获得它的名称。因为它只使用比较对元素进行操作,所以它是比较排序。虽然算法简单,但对大列表的排序效率不高,其他算法更好。维基百科 冒泡排序的最坏情况和平均复杂度都是n2(О),其中n是被排序的项目数.有许多排序算法,其最坏情况或平均复杂度为O(n log )。即使是其他的n2排序算法,如插入排序算法,也往往比气泡排序算法具有更好的性能。因此,当n很大时,气泡排序不是一种实用的排序算法。 冒泡排序相对于大多数其他实现,甚至比快速排序(但不是插入排序)具有的唯一显著优势是,检测列表被排序的能力被有效地内置到算法中。对于已经排序的列表(最好的情况),冒泡排序的性能是O(n).相反,大多数其他算法,甚至那些具有更好的平均案例复杂度的算法,在集合上执行他们的整个排序过程,因此更加复杂。但是,插入排序不仅具有这一机制,而且在基本上排序的列表(有少量倒置)上也表现得更好。 气泡排序中元素的位置将在很大程度上决定它的性能。列表开头的大型元素不会造成问题,因为它们很快就会被交换。然而,接近尾声的小元素移动到起点的速度非常缓慢。 这个行话文件也称气泡排序为“一般糟糕的算法”。该文件以“典型的反常糟糕的算法”而闻名。唐纳德·克努斯(2 Donald Knuth )在他的著名著作“计算机编程艺术”( The Art of Computer Programming )中得出结论:“气泡排序似乎没有什么可推荐的,只有一个醒目的名字。” 气泡排序与现代CPU硬件的交互能力也很差。它要求的写入量至少是插入排序的两倍,是未命中缓存的两倍。 在爪哇显示泡沫排序大约比 插入排序 慢5倍,比 选择排序慢40%。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8690732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档