我正在尝试使用气泡算法方法按属性值(EnemyDificultyLevel(对统一对象列表进行排序,但是它出了点问题,我无法弄清楚它是什么。 一个值总是最终放错地方。
for (int i =0; i< auxenemyPrefabs.Length; i++)
{
float val1 = auxenemyPrefabs[i].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
for (int j = auxenemyPrefabs.Length-1; j >0; j--)
{
float val2 = auxenemyPrefabs[j].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
if (val1 > val2)
{
GameObject aux = auxenemyPrefabs[i];
auxenemyPrefabs[i] = auxenemyPrefabs[j];
auxenemyPrefabs[j] = aux;
}
}
}
有两件事:
- 您正在从数组的已排序部分交换元素(
j > 0
应该j > i
( - 您正在第二个循环中更新
auxenemyPrefabs[i]
,但没有更新应与当前值auxenemyPrefabs[i]
相对应val1
。
for (int i = 0; i < auxenemyPrefabs.Length - 1; i++)
{
float val1 = auxenemyPrefabs[i].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
// j<=i is already sorted
for (int j = auxenemyPrefabs.Length - 1; j > i; j--)
{
float val2 = auxenemyPrefabs[j].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
if (val1 > val2)
{
GameObject aux = auxenemyPrefabs[i];
auxenemyPrefabs[i] = auxenemyPrefabs[j];
auxenemyPrefabs[j] = aux;
val1 = val2;
}
}
}
正如在其中一条评论中提到的,这不是气泡排序,这是选择排序。
您可以通过记住内部循环中的最小索引并在最后交换元素来摆脱一些不必要的交换:
for (int i = 0; i < auxenemyPrefabs.Length - 1; i++)
{
float val1 = auxenemyPrefabs[i].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
int minindx = i;
// j<=i is already sorted
for (int j = auxenemyPrefabs.Length - 1; j > i; j--)
{
float val2 = auxenemyPrefabs[j].GetComponent<EnemyDifficultyAlgorithm_DCH>().EnemyDificultyLevel;
if (val1 > val2)
{
minindx = j;
val1 = val2;
}
}
GameObject aux = auxenemyPrefabs[i];
auxenemyPrefabs[i] = auxenemyPrefabs[minindx];
auxenemyPrefabs[minindx] = aux;
}
但总的来说,这可能不是最好的主意,特别是如果你有一个很大的预制件列表。在内部循环中,对同一预制件调用GetComponent
n 次。