gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:15:55 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com