简体   繁体   English

选择排序和冒泡排序之间的比较数量保持不变

[英]Number of Comparisons between selection sort and bubble sort keep coming up the same

I have written this program to compare the number of operations needed to sort a random numbers using both selection and bubble sort. 我编写了这个程序来比较使用选择和冒泡排序对随机数进行排序所需的操作数。 However, these numbers keep coming up the same and I can't figure out where my code went wrong. 但是,这些数字不断变化,我无法弄清楚代码出错的地方。

static int num_comps;   

public static void main(String[] args) 
{
    Random rnd = new Random();

    // max size of array
    // number of N inputs
    int array_size = 32768;
    int num_datasets = 12;

    // allocate array once to the max size
    int[] vals = new int[array_size];

    // temp array with allocated array to max size
    int[] tvals = new int[array_size];

    // array to hold operation counts
    int[] op_counts = new int[num_datasets];
    int[] op_counts2 = new int[num_datasets];

    // array to hold the size of each array
    //
    int[] arraySizes = new int[num_datasets];

    int i;
    int j;
    int sz;

    for (i = 0, sz = 16; i < num_datasets; i++, sz *= 2)
        arraySizes[i] = sz;

    for (int iter = 0; iter < num_datasets; iter++)
    {
        int curr_size = arraySizes[iter];

        // load array with random values
        //
        for (i = 0; i < curr_size; i++)
            vals[i] = rnd.nextInt(4999);

        for (i = 0; i < curr_size; i++)
            tvals[i] = vals[i];

        // run the bubble sort algorithm
        //
        num_comps = 0;
        bubbleSort(tvals, curr_size);
        op_counts[iter] = num_comps;
        //System.out.println("Num comps at " + iter + " is " + num_comps);

        // run the selection-sort algorithm
        num_comps = 0;
        selectionSort(tvals, curr_size);
        op_counts2[iter] = num_comps;
        //System.out.println("Num comps at " + iter + " is " + num_comps);
    }

    System.out.println("Operation Counts (N vs. op Count): ");
    for (int k = 0; k < num_datasets; k++)
        System.out.println(arraySizes[k] + "\t\t" + op_counts[k] + "\t\t" + op_counts2[k]);
}

static void bubbleSort(int vals[], int curr_size)
{
    int temp;
    for (int i = 0; i < curr_size - 1; i++)
    {
        for (int j = 0; j < curr_size - i - 1; j++)
        {
            // swap
            num_comps = num_comps + 1;
            if (vals[j+1] < vals[j])
            {
                temp = vals[j];
                vals[j] = vals[j+1];
                vals[j+1] = temp;
            }
        }
    }
}

static void selectionSort(int vals[], int curr_size)
{
    int temp;
    for(int i=0; i<curr_size - 1; i++)
     {
        for(int j=i+1; j<curr_size; j++)
        {
            num_comps = num_comps + 1;
            if(vals[i] > vals[j] )
            {
                temp = vals[j];
                vals[j] = vals[i];
                vals[i] = temp;
            }
        }
     }
}

Your selection sort algorithm does not search for the lowest value in the list. 您的选择排序算法不会搜索列表中的最低值。 And swapping it afterwards with the index of the outer loop. 然后用外循环的索引交换它。

You should do something like this: 你应该做这样的事情:

static void selectionSort(int vals[], int curr_size)
{
    int temp;
    for(int i=0; i<curr_size - 1; i++)
    {
        int lowest = i;
        for(int j=i+1; j<curr_size; j++)
        {
            num_comps = num_comps + 1;
            if(vals[lowest] > vals[j] )
            {
                lowest = j;
            }
        }

        // swap lowest with current index
        temp = vals[lowest];
        vals[lowest] = vals[i];
        vals[i] = temp;
     }
}

(of course this can be optimized further) The strength of this algorithm is not the amount of of comparisons, but this amount of swaps (which is at a minimum, I suppose). (当然这可以进一步优化)这个算法的强度不是比较的数量,而是交换量(我认为这是最小的)。

Your bubble sort algorithm seems ok to me. 您的冒泡排序算法对我来说似乎没问题。

Both have the same two loops, so comparing the counts of the current implementations indeed result in the same values. 两者都具有相同的两个循环,因此比较当前实现的计数确实导致相同的值。 But, I think you can optimize the bubble sort, to stop earlier (when no swaps were found). 但是,我认为你可以优化冒泡排序,提前停止(当没有发现掉期时)。 Again, the strength of sorting algorithms depends on the used ones, and are not necessarily the least amount of comparisons. 同样,排序算法的强度取决于所使用的算法,并且不一定是最少量的比较。 So Using the correct algorithm for your specific task, and thereby circumventing the task-specific high cost operations, is important! 因此,为您的特定任务使用正确的算法,从而规避任务特定的高成本操作,非常重要!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM