冒泡排序实现

时间:2012-07-25 07:38:45

标签: java bubble-sort

我试图实现冒泡排序,但我不确定它是否正确。如果你可以看看它是否是一个泡沫排序,可以更好地完成,请不要害羞。这是代码:

package Exercises;

import java.util.*;

public class BubbleSort_6_18 
{
    public static void main(String[] args) 
    {
        Random generator = new Random();

        int[] list = new int[11];
        for(int i=0; i<list.length; i++)
        {
            list[i] = generator.nextInt(10);
        }

        System.out.println("Original Random array: ");
        printArray(list);

        bubbleSort(list);

        System.out.println("\nAfter bubble sort: ");
        printArray(list);
    }

    public static void bubbleSort(int[] list)
    {
        for(int i=0; i<list.length; i++)
        {
            for(int j=i + 1; j<list.length; j++)
            {
                if(list[i] > list[j])
                {
                    int temp = list[i];
                    list[i] = list[j];
                    list[j] = temp;
                }
            }

        }
    }

    public static void printArray(int[] list)
    {
        for(int i=0; i<list.length; i++)
        {
            System.out.print(list[i] + ", ");
        }
    }
}

16 个答案:

答案 0 :(得分:7)

private static int [] bublesort (int[] list , int length) {

    boolean swap = true;
    int temp;

    while(swap){

        swap = false;

        for(int i = 0;i < list.length-1; i++){              
            if(list[i] > list[i+1]){
                temp = list[i];
                list[i] = list[i+1];
                list[i+1] = temp;                   
                swap = true;
            }
        }
    }
    return list;
}

答案 1 :(得分:4)

Mohammod Hossain的实施相当不错,但他做了很多不必要的迭代,遗憾的是他没有接受我的编辑,因为声誉点我无法发表评论所以这里应该是这样的:

public void sort(int[] array) {
        int temp = 0;
        boolean swap = true;
        int range = array.length - 1;
        while (swap) {
            swap = false;
            for (int i = 0; i < range; i++) {
                if (array[i] > array[i + 1]) {
                    temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                    swap = true;
                }
            }
            range--;
        }
    }

答案 2 :(得分:2)

这是冒泡排序的calssical实现,似乎没问题。有几种优化可以做,但总体思路是一样的。以下是一些想法:

  • 如果在内循环中没有执行交换时存在外循环的迭代,则中断,不再继续使用
  • 在外循环的每次迭代中交换内部循环的方向 - 从左到右进行一次,然后从右到左进行一次(这有助于避免元素缓慢向右端移动)。

答案 3 :(得分:2)

{
    System.out.println("The Elments Before Sorting:");
    for(i=0;i<a.length;i++)
    {
        System.out.print(a[i]+"\t");
    }
    for(i=1;i<=a.length-1;i++)
    {
      for(j=0;j<=a.length-i-1;j++)
      {
          if((a[j])>(a[j+1]))
          {
              temp=a[j];
              a[j]=a[j+1];
              a[j+1]=temp;
            }
       }
      System.out.println("The Elements After Sorting:");
      for(i=0;i<a.length;i++)
      {
            System.out.println(a[i]+"\t");
      }
    }
}

答案 4 :(得分:1)

我认为你通过查看你的代码得到了冒泡排序的想法:

冒泡排序通常如下所示: 假设aNumber是一个随机数:

for (int i = 0; i < aNumber; i++)
{
     for(int j = 0; j < aNumber; j++)

      //Doing something with i and j, usually running it as a loop for 2D array
      //array[i][j] will give you a complete sort.
}

如何冒泡排序,它遍历数组的每个可能的点。我x次 这样做的不利之处在于,它需要对排序的次数进行平方。效率不高,但它确实以最简单的方式完成工作。

答案 5 :(得分:1)

简答:这绝对不是冒泡排序。它是选择排序的一种变体(比通常已知的变种效率低一些)。

VisuAlgo

上查看它们的工作方式可能会有所帮助

为什么这不是冒泡排序?

因为你遍历数组并将每个元素与其右边的每个元素进行比较。如果正确的元素较小,则交换。因此,在第一个外循环迭代结束时,您将在最左侧位置具有最小元素,并且在最坏的情况下您已经完成了N个交换(想想反向排序的数组)。

如果您考虑一下,您实际上并不需要进行所有这些交换,您可以在找到交换后搜索右侧的最小值。这只是选择排序的想法,你选择剩余未排序元素的最小值并将其放在正确的位置。

冒泡排序看起来如何?

在冒泡排序中,您始终比较两个相邻的元素,并将较大的元素向右气泡。在外循环的第一次迭代结束时,您将在最右侧位置拥有最大元素。当数组已经排序时,swap标志会停止外部循环。

void bubbleSort(int[] arr) {
    boolean swap = true;       
    for(int i = arr.length - 1; i > 0 && swap; i--) {
        swap = false;
        // for the unsorted part of the array, bubble the largest element to the right.
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[j+1]) {
                // swap
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                swap = true;
            }
        }
    }
}

答案 6 :(得分:0)

  • 您可以循环遍历数组,直到不再交换任何元素
  • 当你把元素放在最后一个位置时你知道它是最大的,所以你可以用1来理解内循环

答案 7 :(得分:0)

我的第一个本科年(&#34; BlueJ时代&#34;)的while循环的bubbleort版本。

public static void bubbleSort()
    {
        int[] r = randomArrayDisplayer();
        int i = r.length;
        while(i!=0){
            int j = 0;
            while(j!=i-1){
                if(r[j+1]<r[j]){
                    swap(r,j,j+1);
                }
                j++;
            }
            i--;
        }
    }

private static void swap(int[] r, int u, int v)
    {
       int value = r[u];
       r[u] = r[v];
       r[v] = value;
       arrayDisplayer(r);
    }

我的建议是显示每一步,以确保正确的行为。

答案 8 :(得分:0)

public class BubbleSort {
    public static void main(String[] args) {
        int arr[] = {64, 34, 25, 12, 22, 11, 90};
        BubbleSort client=new BubbleSort();
        int[] result=client.bubbleSort(arr);
        for(int i:result)
        {
            System.out.println(i);
        }
    }
    public int[] bubbleSort(int[] arr)
    {
        int n=arr.length;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n-i-1;j++) 
                if(arr[j]>arr[j+1])
             swap(arr,j,j+1);   
        }
        return arr;
    }
    private int[] swap(int[] arr, int i, int j) {
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
        return arr;
    }


}

答案 9 :(得分:0)

上面的代码看起来像实现选择排序,它不是冒泡排序。

请查看下面的冒泡排序代码。

Class BubbleSort {
public static void main(String []args) {
int n, c, d, swap;
Scanner in = new Scanner(System.in); 
System.out.println("Input number of integers to sort");
n = in.nextInt();

int array[] = new int[n]; 
System.out.println("Enter " + n + " integers");

for (c = 0; c < n; c++) 
  array[c] = in.nextInt();

for (c = 0; c < ( n - 1 ); c++) {
  for (d = 0; d < n - c - 1; d++) {
    if (array[d] > array[d+1]) /* For descending order use < */
    {
      swap       = array[d];
      array[d]   = array[d+1];
      array[d+1] = swap;
    }
  }
}

System.out.println("Sorted list of numbers");

for (c = 0; c < n; c++) 
  System.out.println(array[c]);
}
}

答案 10 :(得分:0)

/*
Implementation of Bubble sort using Java
*/

import java.util.Arrays;
import java.util.Scanner;


public class BubbleSort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
            Scanner in = new Scanner(System.in);
            System.out.println("Enter the number of elements of array");
            int n = in.nextInt();
            int []a = new int[n];
            System.out.println("Enter the integer array");
            for(int i=0; i<a.length; i++)
            {
                a[i]=in.nextInt();
            }
            System.out.println("UnSorted array: "+ Arrays.toString(a));         
            for(int i=0; i<n; i++)
            {
                for(int j=1; j<n; j++)
                {
                    if(a[j-1]>a[j])
                    {
                        int temp = a[j-1];
                        a[j-1]=a[j];
                        a[j]=temp;
                    }
                }
            }
            System.out.println("Sorted array: "+ Arrays.toString(a));           
    }
}


/*
****************************************
Time Complexity: O(n*n)
Space Complexity: O(1)
****************************************
*/

答案 11 :(得分:0)

class BubbleSort {

public static void main(String[] args) {

    int a[] = {5,4,3,2,1};
    int length = a.length - 1;

    for (int i = 0 ; i < length ; i++) {
        for (int j = 0 ; j < length-i ; j++) {
            if (a[j] > a[j+1]) {
                int swap = a[j];
                a[j] = a[j+1];
                a[j+1] = swap;
            }
        }
    }

    for (int x : a) {
        System.out.println(x);
    }
}

}

答案 12 :(得分:0)

是的,似乎是冒泡排序元素

冒泡排序

void bubbleSort(int arr[])
{
    int n = arr.length;
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-i-1; j++)
            if (arr[j] > arr[j+1])
            {
                // swap temp and arr[i]
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
}

在最坏的情况下,它将给出O(n ^ 2),即使数组已经排序。

答案 13 :(得分:0)

    int[] nums = new int[] { 6, 3, 2, 1, 7, 10, 9 };

        for(int i = nums.Length-1; i>=0; i--)
            for(int j = 0; j<i; j++)
            {
                int temp = 0;
                if( nums[j] < nums[j + 1])
                {
                    temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }

答案 14 :(得分:0)

package com.examplehub.sorts;

public class BubbleSort implements Sort {

  /**
   * BubbleSort algorithm implements.
   *
   * @param numbers the numbers to be sorted.
   */
  public void sort(int[] numbers) {
    for (int i = 0; i < numbers.length - 1; ++i) {
      boolean swapped = false;
      for (int j = 0; j < numbers.length - 1 - i; ++j) {
        if (numbers[j] > numbers[j + 1]) {
          int temp = numbers[j];
          numbers[j] = numbers[j + 1];
          numbers[j + 1] = temp;
          swapped = true;
        }
      }
      if (!swapped) {
        break;
      }
    }
  }

  /**
   * Generic BubbleSort algorithm implements.
   *
   * @param array the array to be sorted.
   * @param <T> the class of the objects in the array.
   */
  public <T extends Comparable<T>> void sort(T[] array) {
    for (int i = 0; i < array.length - 1; ++i) {
      boolean swapped = false;
      for (int j = 0; j < array.length - 1 - i; ++j) {
        if (array[j].compareTo(array[j + 1]) > 0) {
          T temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
          swapped = true;
        }
      }
      if (!swapped) {
        break;
      }
    }
  }
}

source from

答案 15 :(得分:0)

function bubbleSort(arr,n) {
    if (n == 1)  // Base case
    return; 
    // One pass of bubble sort. After
    // this pass, the largest element
    // is moved (or bubbled) to end. and count++

    for (let i = 0; i <n-1; i++){
        if (arr[i] > arr[i + 1]) 
        { 
            let temp = arr[i]; 
            arr[i] = arr[i + 1]; 
            arr[i + 1] = temp; 
        }
    }
    // Largest element is fixed,
    // recur for remaining array
    console.log("Bubble sort Steps ", arr, "   Bubble sort array length reduce every recusrion ", n);
    bubbleSort(arr, n - 1);
}
let arr1 = [64, 3400, 251, 12, 220, 11, 125]
bubbleSort(arr1, arr1.length); 
console.log("Sorted array : ", arr1);

enter image description here

enter image description here