2016-12-11 97 views
0

我试图排除arr排除那些已被选为最大的数字,但它没有工作。排序数组应该怎么做?

结果是这样的:

正如我打算在第一循环中,商店是{9, 0, 0, 0, 0 ... }并且当arr[i]变得9,过程的其余部分应该被跳过。我必须对它进行排序而不需要额外的功能,这对我来说太难了。问题是什么?

int i = 0; 
int j = 0; 
int num = 0; 
int sign = 0; 
int arr[10] = { 1,5,3,4,8,7,5,9,8,0 }; 
int max = arr[0]; 
int store[10] = { 0 }; 
int k = 0; 

for (j = 0; j < 10; j++) { 
    printf("store: "); 
    for (int n = 0; n < 10; on++) 
     printf("%d ", store[n]); 
    printf("\n"); 
    for (i = 0; i < 10; i++) { 
     sign = 0; 
     k = 0; 
     while (k < 10) { 
      if (arr[i] == store[k]) { 
       sign = 1; 
       break; 
      } 
      k++; 
     } 
     if (sign == 1) { 
      continue; 
     } 

     if (arr[i] > max) { 
      max = arr[i]; 
     } 
    } 

    store[j] = max; 

} 
+0

C语言。我忘了..对不起 – KYH

+3

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Biffen

+1

“什么问题?”逻辑。 – TigOldBitties

回答

0

使用i和j。

N是10,数据由混洗号码0到N-1组成。

j从0变为N-1。在每个步骤中,您要用 填充未处理输入的最大值。

所以我从j + 1到N-1,在内部循环中。如果arr [j] < arr [i], swap arr [i]和arr [j]。

当你接近尾声时,它会显着加速。

1

您有几个错误这里:

阵列store的大小为10,但在第j通过外循环,只有j值已被填充;其余的仍然是零。因此,无论何时您重复使用store,都应该使用j作为上限。

您正在寻找每个迭代中的最大值。因此,仅在外环之外初始化max是不够的。你这样做,它会永远保持9。您应该每j重置max

最后,你的想法要通过数组来查看你是否已经处理了某个值是行不通的。你的阵列有重复的,两个8和两个5。您只会在策略中放置一个八位和一个五位,并将最后两个元素的最后一个值max重新使用。 (另外,这种想法导致O(N 3)代码,这是非常浪费的。

您可以解决因守在那里你存储你是否(1)否(0)已经处理的值额外的数组在某个索引处或通过将处理过的条目设置为非常低的值

要实现的是选择排序:在整个列表中查找最大值并将其移到前面,然后查找最大值在整个列表中,除了第一个项目并将其移至第二个插槽,依此类推:

* 1 5 3 4 8 7 5 9 8 0 
9 * 5 3 4 8 7 5 1 8 0 
9 8 * 3 4 5 7 5 1 8 0 
9 8 8 * 4 5 7 5 1 3 0 
9 8 8 7 * 5 4 5 1 3 0 
9 8 8 7 5 * 4 5 1 3 0 
9 8 8 7 5 5 * 4 1 3 0 
9 8 8 7 5 5 4 * 1 3 0 
9 8 8 7 5 5 4 3 * 1 0 
9 8 8 7 5 5 4 3 1 * 0 
9 8 8 7 5 5 4 3 1 0 * 

在这里,星号左侧的所有项目都已排序,星号右侧的所有项目仍未排序。当*(在位置j)已经移动到右侧时,整个数组被排序。

这种排序是在原地:它破坏了数组的原始顺序。这很有用,因为元素的位置告诉我们它是否已被处理。在第三次迭代中,该算法可以区分已经排序的8个和尚未排序的8个。 (这种排序通常被描述为对一张牌进行排序:查看最低点,将其放在左侧等等。如果您必须排序到第二个数组中,请复制原始数组并对其进行排序。)

这里有你排序数组,并打印出上面的图表中的代码:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int arr[10] = {1, 5, 3, 4, 8, 7, 5, 9, 8, 0}; 
    int i = 0; 
    int j = 0; 

    for (j = 0; j < 10; j++) { 
     int imax = j; 
     int swap = arr[j]; 

     // print array 
     for (i = 0; i < 10; i++) { 
      if (i == j) printf("* "); 
      printf("%d ", arr[i]); 
     } 
     printf("\n"); 

     // find index of maximum item 
     for (i = j + 1; i < 10; i++) { 
      if (arr[i] > arr[imax]) { 
       imax = i; 
      } 
     } 

     // swap first unsorted item and maximum item 
     arr[j] = arr[imax]; 
     arr[imax] = swap; 
    } 

    // print fully sorted array 
    for (i = 0; i < 10; i++) { 
     printf("%d ", arr[i]); 
    } 
    printf("*\n"); 

    return 0; 
}