为整数数组创建自定义排序?

时间:2014-11-10 21:02:19

标签: java arrays algorithm sorting

是的,所以我有一个2部分排序算法。它全部基于14个随机整数的数组。例如:

int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5};

现在,我要弄清楚如何做的第一件事就是计算原始数组中存在的特定数量。因此,我们知道1存在一次,而2在原始数组中存在4次。但就像在视觉上看到这一样简单,如果我们无法访问原始数组该怎么办。因此,我需要设计一种方法来计算每个数字1-9中存在的数量,并将其放入一个名为 count 的新数组中。因此,计数中的索引0将表示整数1,并且其值为1.索引1将表示整数2并且值为4.依此类推。这是我到目前为止所得到的但是我被卡住了。排序对我来说非常具有挑战性。

public static void main(String[] args)
{
  // int[] countFinal = {1,4,1,2,1,0,1,2,2}; // The number of times a number 1-9 appears in a[].
  // int[] sortedFinal = {1,2,2,2,2,3,4,4,5,7,8,8,9,9}; // What we need as a final product.
  int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5};
  //int[] count = {};
  int[] sorted = {};
  countHowMany(a, 1);
  countHowMany(a, 2);
  countHowMany(a, 3);
  countHowMany(a, 4);
  countHowMany(a, 5);
  countHowMany(a, 6);
  countHowMany(a, 7);
  countHowMany(a, 8);
  countHowMany(a, 9);


}

public static int countHowMany(int[] array, int value)
{
  // Gathering a count for how many times a number 1-9 exists and adding it to count[];
  int howManyCount = 0;
  for (int i = 0; i < array.length; i++)
  {
     if (array[i] == value)
     {
        howManyCount++;
     }
  }
  System.out.println(howManyCount);
  count = new int[9];
  count[howManyCount];
  System.out.println(Arrays.toString(count); // Testing the input
  return howManyCount;


 }  

它似乎计算数组中项目正确存在的次数。现在我只想弄清楚如何将该值添加到新的数组count []中并为每个countHowMany()执行此操作。这是我坚持的部分。

一旦我弄清楚count [],我可以用它来创建sorted []。现在排序应该做的是从原始数组中获取数据并计算[]并创建一个新的数组,按升序对其进行排序并允许重复。因此,因为1发生一次而2发生四次,所以新数组将被排序[] = {1,2,2,2,2,...}

这是一个相对较小的程序和少量的整数,所以我可以根据需要创建数组。关键是我只能使用数组而不能使用说ArrayLists。

3 个答案:

答案 0 :(得分:2)

您无需单独计算每个值。您可以迭代遍历整个数组,并在遇到每个元素时递增计数器。

int counts = new int[20];  // Choose a value that's bigger than anything in your array.
int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5};    

for (int value : a) {
    counts[value]++;
}

如果您不知道数组中可能存在的最大值,那么最好使用Map存储计数,或使用某种List根据需要增加大小。

答案 1 :(得分:0)

最好只浏览一次数组并为每个可能出现的值递增一个计数器:

int counts[] = new int[10];
for (int n: array)
    counts[n]++;

这足以将n中的每个counts[n]计算在内。count[]。然后,您可以从for数组中读取值。

顺便说一下,对于数组上的int counts[] = new int[10]; for (int i=0; i<array.length; i++) { int n = array[i]; counts[n]++; } 循环,您可能没有遇到过这种语法。它相当于

{{1}}

但它不那么冗长。

答案 2 :(得分:0)

您的方法也可能无效,因为您没有对countHowMany函数的返回值执行任何操作。这将完成你想要的:

public static void main(String[] args)
{
  int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5};

  //count the instances of each number in the array
  int[] count = new int[9];
  for(int i = 0; i < count.length; i++)
    count[i] = countHowMany(a, i+1);

  //put the values in the sorted array
  int[] sorted = new int[a.length];
  int position = 0; // stores the place in the array to put the new digit
  for(int digit = 0; digit < 9; digit++)
  {
    for(int inst = 0; inst < count[digit]; inst++)
    {
      sorted[position] = digit + 1;
      position++;
    }
  } 

  System.out.println(Arrays.toString(sorted));
}

你的代码的问题是你试图在countHowMany方法的每次调用中创建count数组,但是一旦方法完成就会销毁这个数组。方法调用应该只返回计数,然后这些返回应该从方法外部放入count数组。但请注意,还有其他方法可以计算每个值的实例数,如其他答案所示。