2016-10-23 3 views
-1

Существует множество подходов к поиску пиков. Рассмотрим массив данных x []. Для нашего проекта мы определяем пик как элемент массива, который является локальным максимумом, большим, чем каждый из его соседей, в 2 или более раз. Первый и последний элементы в массиве имеют только один сосед и по определению не могут быть пиками. Поэтому, учитывая этот массив X [] с 20 элементами:Печать отсортированных (восходящих) плавающих данных с включенным индексом

0,20 0,50 0,10 0,15 0,20 0,13 0,30 0,25 0,30 0,30 (элементы 0-9)

0,70 0,20 0,45 0,15 0,20 0,85 0,30 0,65 0,20 0,10 (элементов 10- 19)

Пики находятся в точке x [1] = 0,5, x [10] = 0,7, x [12] = 0,45, x [15] = 0,85, x [17] = 0,65.

Для этого проекта вы напишите программу, которая сканирует массив данных, находит пики на основе указанного выше критерия и (для дополнительного кредита) сортирует их в порядке возрастания. Вот что вы должны делать:

Объявите и инициализируйте массив x [] из 20 поплавков.

float [] x = {0.2f, 0.5f, 0.1f, 0.15f, 0.2f, 0.13f, 0.3f, 0.25f, 0.3f, 0.3f, 0.7f, 0.2f, 0.45f, 0,15f, 0,2f, 0,85f, 0,3f, 0,65f, 0,2f, 0,1f};

Распечатайте элементы x [], 10 на каждой строке с точностью до 2 знаков после запятой.

Найдите пики в x [] и сохраните их индексы в массиве с пиками [].

Распечатайте индекс и данные для каждого пика в том порядке, в котором они отображаются в x [].

Пока мой код выглядит следующим образом:

float[] x = {0.2f, 0.5f, 0.1f, 0.15f, 0.2f, 0.13f, 0.3f, 0.25f, 0.3f, 0.3f, 
       0.7f, 0.2f, 0.45f, 0.15f, 0.2f, 0.85f, 0.3f, 0.65f, 0.2f, 0.1f}; 

    int numPeaks = 0; // Amount of peaks found. 
    int[] peaks = new int[x.length]; 

    System.out.println("Data array:"); // Print header. 

    // Print out data. 
    for (int i = 0; i < x.length; i++) { 
     System.out.printf("%.2f ", x[i]); 
     if (i == (x.length - 1)/2) { 
      System.out.println(); 
     } 
    } 
    System.out.println("\n"); // Double line break. 

    // Search for peaks and stores them into peaks[i]. 
    // Also counts how many peaks there are. 
    for (int i = 1; i < x.length - 1; i++) { 
     if (x[i] > (x[i-1] * 2) && x[i] > (x[i+1] * 2)) { 
      numPeaks++; 
      peaks[i] = i; 
     } 
    } 
    // Print number of peaks found. 
    System.out.println(numPeaks + " peaks found:"); 

    // Print only the peaks found along with their indices. 
    for (int i = 1; i < x.length - 1; i++) { 
     if (x[i] > (x[i-1] * 2) && x[i] > (x[i+1] * 2)) { 
      System.out.printf("%2d", peaks[i]); 
      System.out.println(" " + x[i]); 
     } 
    } 

и выход:

Data array: 
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30 
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10 

5 peaks found: 
1 0.5 
10 0.7 
12 0.45 
15 0.85 
17 0.65 

и я хочу выход, чтобы выглядеть следующим образом:

Data array: 
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30 
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10 

5 peaks found: 
1 0.5 
10 0.7 
12 0.45 
15 0.85 
17 0.65 

Sorted peaks: 
12 0.45 
1 0.5 
17 0.65 
10 0.7 
15 0.85 
17 0.65 

Я просто не могу» t похоже, что индексы элементов должны быть привязаны к отсортированным плавающим данным правильно. Спасибо заранее, если кто-то может помочь.

Если есть какая-либо информация, мне не хватает, пожалуйста, просто спросите

+0

В то время как вопросы домашней работы технически по теме при переполнении стека, они __very нахмурились. –

ответ

0

Решение здесь, чтобы отсортировать вас peaks массив, используя сравнение, которое сравнивает значения в исходных данных.

Если вы используете Java-вы могли бы вы Integer объектов, а не int, а затем использовать компаратор:

Integer[] peaks; 
Arrays.sort(peaks, Comparator.comparing(i -> x[i])); 

Вы можете сделать то же самое в Java 7, но вы должны создать свой собственный компаратор.

Смежные вопросы