首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java的快速排序中计算comaprisons和swaps?

如何在Java的快速排序中计算comaprisons和swaps?
EN

Stack Overflow用户
提问于 2017-04-12 06:12:34
回答 2查看 3.7K关注 0票数 1

我有一个用Quicksort对int数组进行排序的简单方法。我不知道如何正确计算交换和比较的数量,因为算法是递归的:

代码语言:javascript
复制
public void quicksort(int tablica[], int x, int y) {
    int i,j,v,temp;
    i=x;
    j=y;
    int swaps=0;
    int comparisons=0;
    v=tablica[(x+y) / 2];
    while (i<=j)
    {
        while (tablica [i] <v)
        {
            i++;
        }
        while (tablica [j] >v)
        {
            j--;
        }
        if (i<=j){
            temp = tablica [i];
            tablica [i]=tablica[j];
            tablica [j] = temp;
            i++;
            j--;
            swaps++;
        }
        comparisons++;
    }
    if (x<j)
        quicksort(tablica,x,j);
    if (i<y)
        quicksort(tablica,i,y);
    System.out.println("Comparisons: " + comparisons);
    System.out.println("Swaps: " + swaps);
}

使用小(10整型)数组运行它将返回以下内容:

代码语言:javascript
复制
Comparisons: 1
Swaps: 1
Comparisons: 1
Swaps: 1
Comparisons: 2
Swaps: 2
Comparisons: 1
Swaps: 1
Comparisons: 1
Swaps: 1
Comparisons: 1
Swaps: 1
Comparisons: 2
Swaps: 1
Comparisons: 4
Swaps: 4

如何正确地做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-04-12 06:18:08

改为定义一个类变量,并在每次运行快速排序方法时更新类变量。

示例

代码语言:javascript
复制
public class example {
  private int swaps=0;
  private int comparisons=0;

  public void quicksort(int tablica[], int x, int y) {
    int i,j,v,temp;
    i=x;
    j=y;

    v=tablica[(x+y) / 2];
    while (i<=j)
    {
        while (tablica [i] <v)
        {
            i++;
        }
        while (tablica [j] >v)
        {
            j--;
        }
        if (i<=j){
            temp = tablica [i];
            tablica [i]=tablica[j];
            tablica [j] = temp;
            i++;
            j--;
            swaps++;
        }
        comparisons++;
    }
    if (x<j)
        quicksort(tablica,x,j);
    if (i<y)
        quicksort(tablica,i,y);
    System.out.println("Comparisons: " + comparisons);
    System.out.println("Swaps: " + swaps);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-12 06:26:07

您可以使用AtomicInteger通过引用传递您的计数器。与使用类变量相反,这种方法是线程安全的,允许您同时执行多个排序,同时保持统计信息的分离。

重新定义您的方法签名:

代码语言:javascript
复制
public void quicksort(int tablica[], int x, int y, AtomicInteger comparisons, AtomicInteger swaps) {

..。并在每次执行交换或比较时递增该值。更改此设置:

代码语言:javascript
复制
swaps++;

..。要这样做:

代码语言:javascript
复制
swaps.incrementAndGet();

..。并改变这一点:

代码语言:javascript
复制
comparisons++;

..。要这样做:

代码语言:javascript
复制
comparisons.incrementAndGet();

最后,更新您的递归调用:

代码语言:javascript
复制
if (x<j)
    quicksort(tablica,x,j, comparisons, swaps);
if (i<y)
    quicksort(tablica,i,y, comparisons, swaps);

编辑:当您要调用quicksort时:

代码语言:javascript
复制
AtomicInteger comparisonCounter = new AtomicInteger(0);
AtomicInteger swapCounter = new AtomicInteger(0);
quicksort(tablica, x, y, comparisonCounter, swapCounter);

// now you can print out the total number of swaps and comparisons
// using swapCounter.get() and comparisonCounter.get()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43357069

复制
相关文章

相似问题

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