2014-11-23 41 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 

我只需要按降序排列打印,实际上没有重新排列int数组,因此:

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 2014-11-23 23:29:14

+0

我不明白你在数组中存储什么?值或字符串?或者两者如何相关? – 2014-11-23 23:30:38

+0

这是一个int数组,根据 – davidc 2014-11-23 23:33:14

回答

1

您可以使用marker (interface) design pattern
通过每次得到的最大时间保持访问索引的记录数组中,让我定义的解决方案结构第一,然后我会穿行:

  1. 做的同样大小的新数组score_list,让我们调用数组
  2. 在for循环中,你会做另一个循环来检查最高分,并在同一时间检查,看是否标记阵列中的最高得分的位置是0

样品运行:
i=0
环路上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); 
}