如何计算组织数组时发生的比较次数?

时间:2017-12-06 06:55:52

标签: java arrays

我有这个java代码,可以对一组随机分数进行排序。我需要做的是修改sortArray,使其返回在调用findMinLoc期间进行的比较总数,并修改main以正确调用修改的sortArray,将总数的比较数量捕获到变量中。我对编程很陌生,而且我对如何做到这一点有一个完整的障碍。我试图使用一个计数器,但它总是只显示分数,而不是显示数组按顺序进行多少次比较。

import java.util.Scanner;
public class Lab11 
{
    public static void main(String[] args) 
    { 
        Scanner stdIn = new Scanner(System.in);
        final int Size = 10; 
        double [] scores = new double[Size];
        // set all the scores to a random number [0 - 99] 
        for (int s = 0; s < Size; ++s)
            scores[s] = (int)(Math.random() * 100);
        // print the scores - original order 
        System.out.println("Scores - Original"); 
        System.out.println("------------------"); 
        printArray(scores, Size); 
        System.out.println("\n");
        // sort the scores 
        System.out.println("Sorting ...\n");
        // print the scores - sorted order 
        sortArray(scores, Size);
        System.out.println("Size of array = " + Size);
        System.out.println("Comparisons needed =   \n");
        System.out.println("Scores - Sorted");
        System.out.println("----------------");
        printArray(scores, Size); 
        System.out.println("\n");
        stdIn.close();
    }
    public static void printArray(double [] arr, int eSize) 
    {
        for (int i = 0; i < eSize; ++i) 
            System.out.println(arr[i]); 
    }
    public static int findMinLoc(double [] arr, int startInd, int     endInd) 
    {
        int minLoc = startInd; 
        for (int i = startInd; i <= endInd; ++i)
        { 
            if (arr[i] < arr[minLoc]) 
                minLoc = i; 
        }
        return minLoc;
    }
    public static void swapInArray(double [] arr, int ind1, int ind2)
    { 
        double tmp = arr[ind1]; 
        arr[ind1] = arr[ind2]; 
        arr[ind2] = tmp; 
    }
    public static void sortArray(double [] arr, int eSize) 
    { 
        for (int i = 0; i < eSize; ++i) 
        { 
            int ind = findMinLoc(arr, i, eSize-1); 
            swapInArray(arr, i, ind); 
        }
    }
}

应该看起来像.. 分数 - 原创----------------- 69.0 56.0 19.0 70.0 88.0 86.0 56.0 19.0 79.0 20.0 排序......

数组大小= 10 所需的比较= 55

分数 - 排序

19.0 19.0 20.0 56.0 56.0 69.0 70.0 79.0 86.0 88.0

我尝试的每种方法总是想出所需的caparisons为10,我不明白为什么。关于如何解决这个问题的任何建议?

3 个答案:

答案 0 :(得分:0)

如果55是您期望的比较量。 全球定义

static int minLocComps = 0;

并添加增量

for (int i = startInd; i <= endInd; ++i)
    { 
        if (arr[i] < arr[minLoc]) 
            minLoc = i; 
        minLocComps++; //<-- Here
    }

最后打印出来。

System.out.println("Comparisons needed = " + minLocComps +"\n");

答案 1 :(得分:0)

只需全局定义静态计数变量,并在finfMinLoc函数中添加计数增量,如下所示:

static int count=0;

public static int findMinLoc(double [] arr, int startInd, int endInd) 
    {
        int minLoc = startInd; 
        for (int i = startInd; i <= endInd; ++i)
        { 
            count++;
            if (arr[i] < arr[minLoc]) 
                minLoc = i; 
        }
        return minLoc;
    }

在print语句中添加count变量:

System.out.println("Comparisons needed =   \n" +count);

答案 2 :(得分:0)

只需添加一个计数器并将其放在比较之后:

import java.util.Scanner;

公共课tst {   private static int comparisonCount = 0;

Wait

}