看算法导论的时候,看他讲到归并排序,
感觉蛮简单的,随手写了一下结果总是不对。
最后发现MERGE这个方法的时候,我原来的代码是:
while ( firstIndex <= q && secondIndex <= r )
调试了才发现我把前半个序列向后推的时候,长度已经超过了q。
有时候光想是件很郁闷的事……
using System ;
namespace SDProject
{
/// <summary >
/// Description of MergeSort.
/// </summary >
public class MergeSort
{
int [] list ={ 5 , 7 , 6 , 8 , 9 , 32 , 13 , 12 , 11 , 2 , 3 , 4 };
public void test ()
{
sort ( 0 , list . Length - 1 );
Console . WriteLine ( "finished" );
}
private void sort ( int p , int r )
{
int q ;
if ( r > p )
{
q =( p + r )/ 2 ;
sort ( p , q );
sort ( q + 1 , r );
MERGR ( p , q , r );
}
}
private void MERGR ( int p , int q , int r )
{
int firstIndex = p ;
int secondIndex = q + 1 ;
int tempSmall ;
while ( firstIndex <= secondIndex && secondIndex <= r )
{
if ( list [ firstIndex ]> list [ secondIndex ])
{
tempSmall = list [ secondIndex ];
for ( int i = secondIndex ; i > firstIndex ; i --)
{
list [ i ]= list [ i - 1 ];
}
list [ firstIndex ]= tempSmall ;
firstIndex ++;
secondIndex ++;
}
else
{
firstIndex ++;
}
}
}
private void SWAP ( int p , int q )
{
int temp = list [ p ];
list [ p ]= list [ q ];
list [ q ]= temp ;
}
}
}