当前位置: 首页 > 面试题库 >

优化的冒泡排序(Java)

缪兴腾
2023-03-14
问题内容

我想知道还有什么可以优化冒泡排序的方法,以便即使在第一次通过之后也可以忽略已经排序的元素。

Eg. [4, 2, 3, 1, 5, 6] --> [2, 3, 1, **4, 5, 6**]

我们观察到[4,5,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+1100000000按顺序。标准的冒泡排序将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;
  }
}

将仅对整个数组进行一次遍历,对上面的示例进行排序,而其余遍历仅对(短)前缀进行遍历。

当然,总的来说,买不到什么,但是优化Bubble排序却是徒劳无益的。



 类似资料:
  • 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位

  • 1. 前言 本节内容是排序算法系列之一:冒泡排序,主要讲解了冒泡排序的主体思路,选取了一个待排序的数字列表对冒泡排序算法进行了演示,给出了冒泡排序算法的 Java 代码实现,帮助大家可以更好地理解冒泡排序算法。 2. 什么是冒泡排序? 冒泡排序(Bubble Sort),是计算机科学与技术领域中较为简单的一种排序算法。 它重复地遍历要排序的序列,会依次比较两个相邻的元素,如果发现两个相邻的元素顺序

  • 定义 冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序之所以叫冒泡排序,是因为使用这种算法进行排序时,数据值会像气泡一样从数组的一端漂浮

  • 本文向大家介绍分享javascript实现的冒泡排序代码并优化,包括了分享javascript实现的冒泡排序代码并优化的使用技巧和注意事项,需要的朋友参考一下 冒泡排序:就是将一个数组中的元素按照从大到小或者从小到大的顺序进行排列。 第一轮比较:8,7,6,5,4,3,2,1,9      交换了8次        i=0   j=array.length-1-i 第二轮比较:7,6,5,4,3,

  • 冒泡排序需要多次遍历列表。它比较相邻的项并交换那些无序的项。每次遍历列表将下一个最大的值放在其正确的位置。实质上,每个项 冒泡 到它所属的位置。 Figure 1 展示了冒泡排序的第一次遍历。阴影项正在比较它们是否乱序。如果在列表中有 n 个项目,则第一遍有 n-1 个项需要比较。重要的是要注意,一旦列表中的最大值是一个对的一部分,它将不断地被移动,直到遍历完成。 Figure 1 在第二次遍历的

  • 冒泡排序(Bubble Sort)是常用的数组排序算法之一,它以简洁的思想与实现方法而备受青睐,也是广大学习者最先接触的一种排序算法。 冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。 冒泡排序的算法比较简单,排序的结果稳定,但时间效率不太高。 Java