2014-11-23 3 views
1

Если у меня есть int[3] массив, как, например:C рода

score_list[3] = [ 1, 2, 0] 

Где каждое место в массиве соответствует определенному Номер документа:

score_list[0] = D1 
score_list[1] = D2 
score_list[2] = D3 

Что бы самый простой способ сортировать массив в порядке убывания, отслеживать место каждого перемещенного int

Где (после сортировки):

score_list[3] = [ 2, 1, 0] 

И

score_list[0] = D2 
score_list[1] = D1 
score_list[2] = D3 

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

for (int i=0; i<3; i++) 
{ 
    if (score_list[0] > score_list[1] && score_list[2]) 
     printf("D%d-%d",i, score_list[0]); 
    if (score_list[1] > score_list[0] && score_list[2]) 
     printf("D%d-%d", i, score_list[1]); 
    if (score_list[2] > score_list[0] && score_list[1]) 
     printf("D%d-%d", i, score_list[2]); 
} 

бы напечатать наибольшее количество первых, я бы сравнить последние 2, я просто чувствую, что это занимает слишком много времени, и должен быть более эффективный способ

+3

Опишите пожалуйста, что вы пробовали. – davidc

+0

Я не понимаю, что вы храните в массиве? значения или строки? Или как связаны два? –

+0

Это массив int, в соответствии с вопросом – davidc

ответ

1

Вы можете решить это, используя marker (interface) design pattern.
Ведя записи посещаемой индекса в массиве каждый раз, когда вы получаете максимальную, позвольте мне определить структуру решения первого, то я буду ходить через него:

  1. Сделать новый массив того же размера score_list, давайте назовем этот массив
  2. в для цикла, вы сделаете еще один цикл для проверки максимального балла и в то же время проверки, чтобы увидеть, если местоположение максимального балла в массиве маркера 0.

Образец прогона:
На i=0
Loop на score_list и найти максимальный балл с маркером == 0, распечатать его, а затем положить маркер на этот счет = 1.
На i=1
Вы будете делать то же самое, но теперь есть в одном месте исключены из списка

Здесь вы пример кода, как это сделать:
Обратите внимание, что: этот код не является исполняемым один (и он не оптимизирован слишком O (N^2)), Я написал его только для объяснения.

int max = -1; 
int doc = -1; 
int marker[3] = {0, 0, 0}; 
for (i=0; i<3; i++) 
{ 
    max = -1; 
    for (j=0; j<3; j++) 
    { 
     // skip this location if it is already printed 
     if (marker[j] == 1) 
      continue; 

     if (score_list[j] > max) 
     { 
      doc = j; 
      max = score_list[j]; 
     } 
    } 

    // this doc will not appear again in the inner for loop (j-loop) 
    marker[doc] = 1; 

    // print the document with the score 
    printf("D%d-%d",doc, max); 
} 
Смежные вопросы