2013-01-13 42 views
1

嘿傢伙我一直在這工作了3天,並沒有拿出我看到的每一個。排序一個數組而不改變它C

我正在嘗試使用大約250個浮點數組並找到第K個最大值,而無需改變該數組或創建一個新數組。

我可以改變它或創建一個新的,因爲其他功能需要以正確的順序放置數據,而且我的Arduino不能在其存儲空間中保存更多值,所以最簡單的兩個選項都沒有了。

Array中的值可能(也可能會)在它們中有重複。

作爲一個EG:如果你有數組::: 1,36,2,54,11,9,22,9,1,36,0,11; 從最大到最小。將:: 1)54 2)36 3)36 4)22 5)11 6)11 7)9 8)9 9)2 10)1 11)1 12)0

任何幫助將是偉大的。 這可能是過分的要求爲會爲我做到這一點很好:)哈哈

這裏功能是我到目前爲止的代碼,但我還沒有試圖讓重複的工作卻並 它一些原因只給我一個答案由於某種原因,這2 ,,,不知道爲什麼,雖然

void setup() 
{ 
    Serial.begin(9600); 
} 
void loop() 
{ 
int Array[] = {1,2,3,4,5,6,7,8,9,10}; 

int Kth = 6; //// just for testing putting the value as a constant 
int tr = 0; /// traking threw the array to find the MAX 

for (int y=0;y<10;y++) //////////// finding the MAX first so I have somewhere to start 
{ 
    if (Array[y]>Array[tr]) 
    { 
    tr = y; 
    } 
} 
Serial.print("The max number is "); 
int F = Array[tr]; 
Serial.println(F); // Prints the MAX ,,, mostly just for error checking this is done 

///////////////////////////////////////////////////////// got MAX 

for (int x = 1; x<Kth;x++) //// run the below Kth times and each time lowering the "Max" making the loop run Kth times 
{ 
    for(int P=0;P<10;P++) // run threw every element 
    { 
    if (Array[P]<F) 
    { 
    for(int r=0;r<10;r++) //and then test that element against every other element to make sure 
          //its is bigger then all the rest but small then MAX 
    { 
     Serial.println(r); 
     if(r=tr) /////////////////// done so the max dosent clash with the number being tested 
     { 
     r++; 
     Serial.println("Max's Placeing !!!!"); 
     } 
    if(Array[P]>Array[r]) 
    { 
     F=Array[P];   ////// if its bigger then all others and smaller then the MAx then make that the Max 
     Serial.print(F); 
     Serial.println(" on the "); 
    } 
}}}} 
Serial.println(F); /// ment to give me the Kth largest number 
delay(1000); 

}

+0

是K的一個數組大小的選項? –

回答

0

如果速度是不是可以採取這種方法的問題(僞):

current=inf,0 

for i in [0,k): 
    max=-inf,0 
    for j in [0,n): 
     item=x[j],j 
     if item<current and item>max: 
      max=item 
    current=max 

current將包含第k個最大項目,其中項目是一對值和索引。

這個想法很簡單。要找到第一大項目,您只需找到最大的項目。要找到第二大項目,您會發現不大於您的第一大項目的最大項目。要找到第三大項目,您會發現不大於第二大項目的最大項目。等等。

這裏唯一的技巧就是因爲可以有重複項目,所以這些項目需要同時包含一個值和一個索引以使它們唯一。

下面是它如何用C實現:

void loop() 
{ 
    int array[] = {1,2,3,4,5,6,7,8,9,10}; 
    int n = 10; 
    int k = 6; //// just for testing putting the value as a constant 
    int c = n; // start with current index being past the end of the array 
      // to indicate that there is no current index. 

    for (int x = 1; x<=k; x++) { 
    int m = -1; // start with the max index being before the beginning of 
       // the array to indicate there is no max index 

    for (int p=0; p<n; p++) { 
     int ap = array[p]; 
     // if this item is less than current 
     if (c==n || ap<array[c] || (ap==array[c] && p<c)) { 
     // if this item is greater than max 
     if (m<0 || ap>array[m] || (ap==array[m] && p>m)) { 
      // make this item be the new max 
      m = p; 
     } 
     } 
    } 
    // update current to be the max 
    c = m; 
    } 
    Serial.println(array[c]); /// ment to give me the Kth largest number 
    delay(1000); 
} 

在C版本,我只是跟蹤當前的和最大的索引,因爲我總是在尋找獲得當前和最大值陣列。

+0

這就是我正在做的想法,但不能把它拉下來.....心裏告訴我上面發生了什麼?試圖對此產生影響,但沒有理解你的變量,,,你在用什麼語言寫作?因爲不幸的是,我不太瞭解,謝謝你的男士 – Spider999

+0

@ Spider999:我已經添加了一個C實現。 –

+0

完美的謝謝你:)早上當我得到一點時間感謝時再次感謝 – Spider999