2014-01-24 61 views
0

我目前有一個2D字符數組大小:[5] [256]。執行選擇排序二維字符陣列

該數組可以保存數字或字母。 我的任務是使用「選擇排序」將字符串按升序排序。

我的想法是將每行轉換爲ASCII,然後按升序對值進行排序,然後轉換回字符。

我實現了一個二維數組選擇排序爲另一個任務,但是,它不工作在這裏,因爲我編碼它與2列而不是像這裏256(不知道如何改變它)工作。

我需要幫助的是如何爲每行使用ASCII值並在選擇排序中使用它。

一直試圖找出這個好幾個小時,現在驅使我心理。

任何幫助表示讚賞。

我不一定要找人爲我編碼,更多的是正確的方向。我是C新手,並沒有意識到C可以做的每個功能。

這裏是充滿我當前的代碼:

#include <stdio.h> 
#include <string.h> 
int main(int argc, char *argv[]) 
{ 
char arc5Strings[5][256]; 
int nCount, nCount2, nCount3, nCount4, nCount5, nCount6, nCount7; 


int fMinVal[1][2] = {1,1}; 
int nMinValPosition; 
int nMoves; 
int nRow; 
int fTemp[1][2] = {1,1}; 
int fTemp2[1][2] = {1,1}; 

//input the values 

for(nCount=0; nCount < 5; nCount++) 
{ 
    printf("Please input string %d/5: ", nCount + 1); 
    fgets(arc5Strings[nCount], 256, stdin); 

} 

printf("\n\n"); 

//print entire array 
for(nCount3 = 0; nCount3 < 5; nCount3++) 
{ 
    for(nCount4 = 0; arc5Strings[nCount3][nCount4] != '\0'; nCount4++) 
    { 
     printf("%d ", arc5Strings[nCount3][nCount4]); 

     //ASCII values outputted in a line instead of in array format when using %c 
    } 

} 



return 0; 
} 

老二維數組選擇排序我設計 - 從代碼中提取: - :

Input1 = 90 
Input2 = 70 
Input3 = abc 
Input4 = 500 
Input5 = 200 

Sorted Array Results: 
200 
90 
70 
abc 
500 
GEORGE的回答結果

//-----------------------------------  
//set up the switch  

for(nCount5 = 0; nCount5 < 5; nCount5++) 
{ 
    fMinVal[0][0] = arc5Strings[nCount5][0]; //min value is row 0 col 1 
    nMinValPosition = nCount5; 

    for(nCount6 = nCount5 + 1; nCount6 < 5; nCount6++) 
    { 
     if(arc5Strings[nCount6][1] < fMinVal[0][0]) 
     { 
      fMinVal[0][0] = arc5Strings[nCount6][0]; 

      nMinValPosition = nCount6; 
     } 
     /* Perform the switch - actually switch the values */ 
     if(fMinVal[0][0] < arc5Strings[nCount5][0]) 
     { 
      fTemp[0][1] = arc5Strings[nCount5][1]; 
      fTemp2[0][0] = arc5Strings[nCount5][0]; 

      arc5Strings[nCount5][1] = arc5Strings[nMinValPosition][1]; 
      arc5Strings[nCount5][0] = arc5Strings[nMinValPosition][0]; 
      arc5Strings[nMinValPosition][1] = fTemp[0][1]; 
      arc5Strings[nMinValPosition][0] = fTemp2[0][0]; 


      nMoves++; 
     } 
    } 
} 


//------------------------------ 
    printf("\n\n"); 

     printf("The sorted list, in ascending order, using selection sort, is:\n\n"); 
    for(nCount3 = 0; nCount3 < 5; nCount3++) 
    { 
     for(nCount4 = 0; arc5Strings[nCount3][nCount4] != '\0'; nCount4++) 
     { 
      printf("%c", arc5Strings[nCount3][nCount4]); 
     } 

    } 

    printf("\n %d moves were made to sort this list\n", nMoves); 

編輯

+0

你是指什麼排序字符串? –

+0

根據字符串的ASCII值將字符串升序排序 –

+0

按長度,首字母值等進行排序通過什麼? –

回答

1

您正確的道路。我會實現這個如下:

for(i=0;i<5;i++) 
{ 
indexOfCurrentSmallest = i; 
for(j=i;j<5;j++) 
{ 
    for(k=0;k<255;k++) 
    { 
    if(arc5Strings[j][k] < arc5Strings[indexOfCurrentSmallest][k]) 
    { 
     //we found a new possible smallest 
     indexOfCurrentSmallest = j; 
     break; 
    } 
    else if(arc5Strings[j][k] > arc5Strings[indexOfCurrentSmallest][k]) 
    { 
     //no point in searching further, the one we are looking at is already larger than the one we found. 
     break; 
    } 
    } 

} 
//here, we have found the actual smallest, let's do a swap 
for(q=0;q<255;q++) 
{ 
    temp = arc5Strings[i][q]; 
    arc5Strings[i][q] = arc5Strings[indexOfCurrentSmallest][q]; 
    arc5Strings[indexOfCurrentSmallest][q] = temp; 
} 
} 

我沒有測試此代碼,但它應該是你要找大致內容。基本上,它比較從左邊開始的ASCII值,直到找到差異,並在比較所有5個字符串之後存儲索引以供稍後交換。

編輯我已經測試了上面的代碼,現在它可以工作。

+0

嗨,喬治,謝謝你的回答。我已經實現了這一點。我覺得我非常接近正確的答案,但排序的數組稍微偏離。我已經將結果添加到OP中 - 我將更深入地探討一下這個問題,看看我能不能找到它 –

+0

嘿Dr. Pepper。我已經測試了代碼並修復了它(並使其效率更高)。我用你的列表並將其正確排序是: 1.200 2.500 3.70 4.90 5.abc – George

+0

感謝喬治,其大加讚賞。現在可以停止撞我的頭!我很高興知道我在正確的路線上! :) –

0

首先找到每個字符串的長度

int length[5]; 
for(i = 0, i < 5, i++){ 
    length[i] = strlen(arc5Strings[i]); 
} 

排序長度。那些相同的,比較第一個字母的值。 就是這樣。

valter