2017-01-08 2 views
0
public static int[] sortBySign(int[] nums){ 
     int startIndex = 0; 
     int endIndex = nums.length - 1; 
while(startIndex < endIndex){ 
    while(nums[startIndex] < 0){ 
      startIndex++; 
    } 
    while(nums[endIndex] > 0){ 
      endIndex--; 
    } 
      int temp = nums[startIndex]; 
      nums[startIndex] = nums[endIndex]; 
      nums[endIndex] = temp; 
      startIndex++; 
      endIndex--; 
     } 
    return nums; 
    } 

Мой код работает для сортировки положительных и отрицательных чисел, но я не уверен, как сортировать нули. Негативы должны быть с левой стороны, нули посередине и положительные с правой стороны. Приказ не имеет значения.Сортировка массива int по знаку (положительный, нулевой, отрицательный) без сортировки

+1

Вы ступенчатую через код в ваш отладчик? Это поможет вам самостоятельно определить, что должно произойти. –

ответ

1

Используя вспомогательный метод подкачки можно обрабатывать нули, как так:

public static int[] sortBySign(int[] array) { 
    int counter = 0; 
    for (int i = 0; i < array.length; i++) { 
    if (array[i] < 0) { 
     swap(array, counter++, i); 
    } 
    } 
    for (int i = counter; i < array.length; i++) { 
    if (array[i] == 0) { 
     swap(array, counter++, i); 
    } 
    } 
    return array; 
} 

private static void swap(int array[], int index1, int index2) { 
    int temp = array[index2]; 
    for (int i = index2; i > index1; i--) { 
    array[i] = array[i - 1]; 
    } 
    array[index1] = temp; 
} 

Попробуйте here!

1

На самом деле, ваш код не sort положительные числа правильно, может быть, потому что это не делает достаточное количество от iterations. Чтобы отсортировать все числа (включая нуль), я рекомендовал бы откатиться к пузырьковой сортировке, например .:

public static void sort(int[] array) { 
    for (int i = 0; i < array.length; i++) { 
     for (int j = 1; j < (array.length - i); j++) { 
      if (array[j - 1] > array[j]) { 
       int temp = array[j - 1]; 
       array[j - 1] = array[j]; 
       array[j] = temp; 
      } 
     } 
    } 
} 

Кроме того, мы не должны ничего return как изменения производятся только фактический массив.

Редактировать

Другим решением для сортировки массива с одним для цикла, (т.е. O(n) сложности):

public static void sort(int[] array) { 
    boolean continue = false; 
    for (int i = 0; i < array.length - 1; i++) { 
     if (array[i] < array[i + 1]) { 
      int temp = array[i]; 
      array[i] = array[i + 1]; 
      array[i + 1] = temp; // swap values 
      continue = true; 
     } 
     if (i == array.length - 2 && again) { 
      i = 0; 
      continue = false; 
     } 
    } 
} 
+0

Спасибо. Я пытался реализовать его так, что это O (n). – laura815

+0

@ laura815 Я добавил еще одно решение. –

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