2013-09-21 2 views
0

У меня вопрос относительно массив. Например, если я знаю, что размер массива будет 5, а моя программа чтения вКак эффективно изменять содержимое массива в соответствии с его содержанием?

[9993, 1000, 9992, 3, 872] 

в массив, как я могу изменить содержимое массива эффективно таким образом, что он становится

[5, 3, 4, 1, 2] 

Я могу реализовать только двойной цикл, который работает в O (n^2). Надеюсь найти для него лучший алгоритм.

Любые подсказки? Заранее спасибо!

+1

Вы пытаетесь построить заказ? Вы можете сделать это в пространстве «O (n log n)» и «O (n)» путем создания вспомогательного массива, содержащего целые числа «1 ... n», сортировку вспомогательного массива с использованием компаратора, который ссылается на элементы исходный массив, а затем копирование вспомогательного массива в исходное. – Jeremy

+0

Привет, Джереми, но я не совсем понимаю, как ссылка на исходные элементы может быть реализована с использованием компаратора. Не могли бы вы подробнее рассказать? – boxme

+0

'if (origArray [auxArray [i] -1] Jeremy

ответ

1

Один из вариантов будет иметь класс, как это:

class Tuple implements Comparable<Tuple> { 
    int value; // value 
    int pos; // position in array 

    public Tuple(int value, int pos) { 
     this.value = value; 
     this.pos = pos; 
    } 

    @Override 
    public int compareTo(Tuple other) { // sort based on values 
     return Integer.compare(value, other.value); 
    } 
} 

Тогда:

Tuple[] tups = new Tuple[array.length]; 

for (int i = 0; i < array.length; i++) 
    tups[i] = new Tuple(array[i], i); 

Arrays.sort(tups); 

for (int i = 0; i < array.length; i++) 
    array[i] = tups[i].pos + 1; 

Это O (п журнал п) процесс, вследствие сортировки массива.

+0

Привет Аршаджий, ваш алгоритм вернет [4, 5, 2, 3, 1]. – boxme

+0

@boxme См. Редактирование, я просто сделал 'tups [i] .pos + 1' на последней строке. – arshajii

0

Для этого вы должны использовать один вид алгоритма сортировки, поэтому лучшим временем выполнения, которое вы сможете получить, является O (n logn). Существует множество алгоритмов сортировки, которые вы можете найти в Интернете, если их ищете. Самые быстрые из которых я бы рекомендовал для начинающих - Quicksort, Mergesort и Heapsort.

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