Я объединил 2 основных класса в один, чтобы отобразить несортированные и отсортированные значения вставленного массива Strings. В приведенном коде использовались целые числа, и я изменил его, чтобы вместо этого использовать строки. У меня проблема с моим insertionSort(). Сравнение с линией приводит к сбою, и я не могу понять, почему!
public void insertionSort()
{
int in, out;
for(out=1; out<nElems; out++) // out is dividing line
{
String temp = a[out]; // remove marked item
in = out; // start shifts at out
System.out.println(a[in]);
--->while(a[in].compareTo(a[in+1])>0 ) // until one is smaller,
{
a[in] = a[in-1]; // shift item to right
--in; // go left one position
}
a[in] = temp; // insert marked item
} // end for
} // end insertionSort()
Вот мой основной класс:
class SortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArraySel arr;//reference to ray1--> selection sort
ArrayIns arr2;// reference to array2--> insertion sort
arr = new ArraySel(maxSize); // create the array
arr2 = new ArrayIns(maxSize);
arr.insert("hello"); //insert words into the array
arr.insert("this");
arr.insert("is");
arr.insert("a");
arr.insert("random");
arr.insert("weird ");
arr.insert("sentence");
arr.insert("that");
arr.insert("does");
arr.insert("not");
arr.insert("make");
arr.insert("any");
arr.insert("sense");
arr2.insert("hello");
arr2.insert("this");
arr2.insert("is");
arr2.insert("a");
arr2.insert("random");
arr2.insert("weird ");
arr2.insert("sentence");
arr2.insert("that");
arr2.insert("does");
arr2.insert("not");
arr2.insert("make");
arr2.insert("any");
arr2.insert("sense");
arr.display(); // display items
arr2.display();
arr.selectionSort();//sort the 2 arrays
arr2.insertionSort();
arr.display(); // display them again
arr2.display();
} // end main()
} // end class SelectSortApp
И вот обновленный класс selectionSort
public void selectionSort()
{
int out, in, min;
for(out=0; out<nElems-1; out++) // outer loop
{
min = out; // minimum
for(in=out+1; in<nElems; in++) // inner loop
if((a[in].compareTo(a[in-1])>0 )) // if min greater,
min = in; // we have a new min
swap(out, min); // swap them
Вы действительно близки к решению
Вы должны сравнить temp
vs a[in-1]
вместо a[in]
vs a[in+1]
Также вам нужно проверить значение in
всегда положительно в while loop
, чтобы избежать IndexOutOfBoundsException
while(in > 0 && temp.compareTo(a[in-1]) < 0)
{
Вам нужно сравнить [in] с [in-1], а не [in + 1]. В вашем свопе уже используются правильные элементы. С кодом как есть, [in + 1] может превышать верхнюю границу вашего массива,
Вот мой выбор, который работает сейчас:
public void selectionSort() {
int out, in, min;
for(out=0; out<nElems-1; out++) // outer loop
{
min = out; // minimum
for(in=out+1; in<nElems; in++) // inner loop
if((a[in].compareTo(a[min])<0 )) // if min greater,
min = in; // we have a new min
swap(out, min); // swap them
} // end for(out)
} // end selectionSort()
a[]
иnElems
?