微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化气泡排序(Java)

我想知道我如何能够优化泡沫排序,以便忽略已经排序的元素,即使在第一次通过之后.
Eg. [4,2,3,1,5,6] --> [2,**4,6**]

我们观察到[4,6]已经排序顺序,怎么修改我的代码,以便在下一遍中忽略这3个元素? (这意味着排序会更有效率吗?)
你建议一种递归方法吗?

public static void bubblesort(int[] a) {
  for(int i=1; i<a.length; i++) {
    boolean is_sorted = true;

    for(int j=0; j<a.length; j++) {
      if(a[j] > a[j+1]) {
         int temp = a[j];
         a[j] = a[j+1];
         a[j+1] = temp;
         is_sorted = false;
      }
    }

    if(is_sorted) return;
  }
}

谢谢你的时间!

解决方法

首先,你有一个超出范围的访问权限:
for(int j=0; j<a.length; j++) {
      if(a[j] > a[j+1]) {

对于j == a.length-1,所以循环条件应该是j<则为a.length-1. 但是,在Bubble排序中,你知道在k遍之后,最大的k个元素被排列在数组的k个最后的条目中,所以常规的Bubble排序使用

public static void bubblesort(int[] a) {
  for(int i=1; i<a.length; i++) {
    boolean is_sorted = true;

    for(int j=0; j < a.length - i; j++) { // skip the already sorted largest elements
      if(a[j] > a[j+1]) {
         int temp = a[j];
         a[j] = a[j+1];
         a[j+1] = temp;
         is_sorted = false;
      }
    }

    if(is_sorted) return;
  }
}

现在,当数组具有最大元素的长排序尾部时,仍然会执行大量不必要的迭代,例如,将k,k-1,…,1作为第一个k个元素,并按顺序排列为k 1到100000000那.标准的气泡排序将通过(几乎)整个数组通过k次.

但是,如果你记得你最后一次交换的位置,那么你知道在这个索引之后,依次是最大的元素

public static void bubblesort(int[] a) {
  int lastSwap = a.length-1;
  for(int i=1; i<a.length; i++) {
    boolean is_sorted = true;
    int currentSwap = -1;

    for(int j=0; j < lastSwap; j++) {
      if(a[j] > a[j+1]) {
         int temp = a[j];
         a[j] = a[j+1];
         a[j+1] = temp;
         is_sorted = false;
         currentSwap = j;
      }
    }

    if(is_sorted) return;
    lastSwap = currentSwap;
  }
}

将对上述示例进行排序,只有一次遍历整个数组,剩余的只通过(短)前缀.

当然,一般来说,这不会买你多少,但是然后优化泡沫排序是一个相当徒劳的运动.

原文地址:https://www.jb51.cc/java/122029.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐