java - 选择排序和冒泡排序之间的比较次数保持相同

标签 java sorting

我编写了这个程序来比较使用选择排序和冒泡排序对随机数进行排序所需的操作数。然而,这些数字不断出现,我无法弄清楚我的代码哪里出了问题。

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;
            }
        }
     }
}

最佳答案

您的selection sort算法不会搜索列表中的最小值。然后将其与外循环的索引交换。

你应该这样做:

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;
     }
}

(当然这还可以进一步优化) 该算法的优势不在于比较的数量,而在于交换的数量(我认为这是最少的)。

您的bubble sort算法对我来说似乎没问题。

两者都有相同的两个循环,因此比较当前实现的计数确实会产生相同的值。但是,我认为您可以优化冒泡排序,以更早停止(当没有找到交换时)。同样,排序算法的强度取决于所使用的算法,并且不一定是最少的比较次数。因此,为您的特定任务使用正确的算法,从而避免特定于任务的高成本操作非常重要!

关于java - 选择排序和冒泡排序之间的比较次数保持相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946049/

相关文章:

java - 将电影文件保存在特定文件夹中 -android-

java - 使用 mongoDB 的 Spring 启动返回 NullPointerException

java - Criteria API 未生成左外连接

java - Android PlaceAutocompleteFragment自动关闭

mysql - 如何找到相似的结果并按相似度排序?

java - 使用 jsp-tags 搜索记录

algorithm - 什么排序算法适合这个 'stream-like' 条件?

python - 根据每个字符串中的子字符串对字符串列表进行排序

python - 使用 python 字典进行排序

Javascript - 从排序 DOM 集合中获得的好处