冒泡排序不起作用

Posted

技术标签:

【中文标题】冒泡排序不起作用【英文标题】:Bubble Sorting not working 【发布时间】:2017-09-29 04:17:03 【问题描述】:

我正在使用冒泡排序算法并在代码上实现它。目标是使用冒泡排序对大小为 N 的整数数组进行排序,计算数据比较次数和数据移动次数,其中数据比较是整数比较的次数,数据移动是整数交换的次数。地方。最后我们只计算执行排序所花费的时间。现在,问题是当 N 的值很大时,比如 1000 / 10000 /20000 等。对于前 30-50 个测试用例,冒泡排序有效,但之后,可以看到许多较小的数字没有被排序.要记住的另一件事是,我将数组元素的值分配给了随机数。

import java.util.Random;
import java.util.Scanner;

public class Bubblesort 
public static long DC;
public static long DM;

public static int[] BBSort(int arr[],int n) 
    int K,t,tmp;

    long Data_comp=0,Data_move=0;

    K = n;
    while(K!=0)
    
        t = 0;
        for (int i = 0; i < K-1; i++) 

            if(arr[i]>arr[i+1])
            
               tmp = arr[i];
               arr[i] = arr[i+1];
               arr[i+1] = tmp;
               t = i;
               Data_move++;
            
            Data_comp++;
        

        K = t;
    
    DC = Data_comp;
    DM = Data_move;
  return arr;


public static void main(String[] args) 
    Scanner sc = new Scanner(System.in);
    Random r = new Random();
    int N;
    N = sc.nextInt();
    int a[];
    a = new int[N];
    for (int i = 0; i < N; i++) 
          a[i]=r.nextInt(10000);
    
    long StartTime,EndTime;
    long Totaltime;
    StartTime = System.currentTimeMillis();
    BBSort(a, N);
    EndTime = System.currentTimeMillis();
    Totaltime = EndTime - StartTime;

    for (int j = 0; j < N; j++) 
        System.out.println(a[j]);
    
    System.out.println("Time taken for sorting = "+Totaltime);
    System.out.println("Number of data comparisons = "+DC );
    System.out.println("Number of data movement = "+3*DM);





【问题讨论】:

【参考方案1】:

您的问题在于您使用变量 t 的方式。只需将其删除并在每次运行结束时使用 K-- 即可解决您的问题。

public static int[] BBSort(int arr[],int n) 
    int K,tmp;

    long Data_comp=0,Data_move=0;

    K = n;
    while(K!=0)
    
        for (int i = 0; i < K-1; i++) 

            if(arr[i]>arr[i+1])
            
               tmp = arr[i];
               arr[i] = arr[i+1];
               arr[i+1] = tmp;
               Data_move++;
            
            Data_comp++;
        

        K--;
    
    DC = Data_comp;
    DM = Data_move;
  return arr;

【讨论】:

代码有效,我删除了变量 t 并且排序正常。现在你能不能解释一下为什么变量“t”造成了这个问题。 Josh Heaps 在下面的答案中几乎回答了它。你不能跳过一些比较。通过仅循环到数字已交换的最后一个索引(变量 t),您可以更改冒泡排序算法并允许它跳过一些根据其直接邻居排序但在您的整个数据集中没有排序的数字。 【参考方案2】:

好的,我相信我已经找到了您的问题。

因此,在冒泡排序中,程序每次都需要遍历每个数字。如果程序不这样做,你就会为数字创造机会,让他们找到错误的位置,并被困在那里。

在您的函数BBSort 中,您的程序正在设置for 循环运行到最后一个有交换的索引的运行次数。在这种情况下,您可能有两个顺序正确的数字,它们本身位于末尾。 IE。拿这个列表: 1, 2, 9, 5, 6, 10 在这个数组上,代码将识别出两个数字正确排序的位置。这意味着,当它到达 6 和 10 时,它会说,“好的,这两个已排序”并且不再触及 6。这是我制作并运行的冒泡排序的一些伪代码:

for i = 0 ; i < number of items in array; i++
    for j = 0; j < number of items in array; j++
        if (list[j] < list[j+1])
            swap list[j] with list[j+1];
    

我希望这对您有所帮助,并且一切顺利!

【讨论】:

以上是关于冒泡排序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

排序在 jQuery 数据表中不起作用

排序在Powershell函数中不起作用[重复]

为啥我的 ExtJS 4.2 网格面板排序不起作用?

DataTables - 排序,搜索,分页不起作用

为啥列表容器的排序功能不起作用[关闭]

奇怪的冒泡排序行为