2013-04-05 71 views
0

所以我已经阅读了5到6篇关于如何重新排列数组的文章,有些按字母顺序排列了一些数字,我也读了这一章。这是我终于想出的,按字母顺序排列字符串数组(或者甚至是* ptr)

void selectionSort (string array[], int size) 
{ 
int startScan, minIndex; 
string minValue; 
for(startScan = 0; startScan<(size-1); startScan++) 
{ 
    minIndex = startScan; 
    minValue = array[startScan]; 
    string temp; 
    for(int index = startScan+1; index<size; index++) 
    if(array[index] <minValue) 
    { 
     minValue = array[index]; 
     minIndex = index; 
    } 
} 
array[minIndex] = array[startScan]; 
array[startScan] = minValue; 
system("pause"); 
} 

显然,这是行不通的。当我运行它时,它会对我说要断开。我认为这是可行的,无论是int还是任何数字类型。哎呀,如果将它设置为char类型的ASCII值,它甚至可能会运行。但实际的任务是一个字符串,我只是无法弄清楚。我曾想过试图剪掉第一个字母并将其转换为字母,但其中一些字符串的姓氏与第一个字母不同,所以这也不起作用。

我需要解决什么问题才能让我的数组按字母排序?

UPDATE在阅读评论和重新回顾本书后,更新了代码中已更改的内容。运行代码时不再出现错误,但仍然无法排序!

+0

如果用“hollers”表示它给你一个错误,请显示该错误。 – 2013-04-05 11:55:18

+1

'std :: sort'有什么问题? – 2013-04-05 11:55:38

+0

你需要做的是正确实现选择排序。你的代码甚至不是选择排序。比较你写的代码到一个真正的选择排序,例如这里http://en.wikipedia.org/wiki/Selection_sort – john 2013-04-05 11:59:05

回答

1

所以,由于某种原因你选择不使用std,(你有两个交换和排序)

我想指出你注意:

temp = array[count]; 
    array[count]=array[(count+1)]; <-- when count is exactly size -1 you are going to commit overflow to your array 
    array[(count+1)] = temp; 

你需要确保你的索引没过数组边界..:

for(int count = 0; count<size -1 ; count++) 

(顺便说一下看看的std ::交换,可能是更好的为你使用)

+0

谢谢,我总是提醒自己,在任务使用数组时,要小心数组的边界,然后我对它感到沮丧,有时忘记:/我希望我可以使用STD交换,但分配是修改selectionSort代码对字符串进行排序 – 2013-04-05 13:27:39

1

有一个明显的界限问题,当你做array[count + 1](当时count == size - 1)。而我不知道代码 是如何排序的。你想用什么算法 使用?

1

对于初学者来说,当你到达数组的末尾时,你会得到一个索引越界异常。由于您正在访问count + 1,因此您的for循环需要停在第1位。这看起来像是一个泡沫排序的开始,但未完全实施。对气泡排序做一点研究,你应该很快得到你的答案。

+0

感谢您将我的注意力吸引到我试图将泡沫排序与选择排序相结合的事实上!不可否认,我也错过了一些元素。 – 2013-04-05 13:30:10