Shell sort не сортирует первый элемент массива - PullRequest
0 голосов
/ 29 сентября 2018

Когда моя сортировка выполняется по этим данным {7,8,4,2,3,9,5,8,4,1}, только первый элемент не помещается на правильное место.Как я могу это исправить?Спасибо за помощь.

public void segmentedInsertionSort(int[] array, int size, int h)
    {
        int temp;

        for(int i = h + 1 ;i < size;i++)
        {
            int j = i - h;


            while(j > 0)
            {
                if(array[j+h] < array[j])
                {
                    temp = array[j];
                    array[j] = array[j+h];
                    array[j+h] = temp;
                    j = j - h;
                }
                else
                {
                    j = 0;
                }
            }
        }
    }

    public void shellSort(int[] array, int size)
    {
        int h = size/2;

        while(h > 0)
        {
            segmentedInsertionSort(array,size,h);
            h = h/2;
        }            
    }

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018
for(int i = h + 1 ;i < size;i++)
        {
            int j = i - h;


            while(j > 0)
            {
                if(array[j+h] < array[j])
                {
                    temp = array[j];
                    array[j] = array[j+h];
                    array[j+h] = temp;
                    j = j - h;
                }

В этой части вы определяете i = h + 1, а затем увеличиваете значение i.Таким образом, при выполнении сортировки значение j никогда не бывает меньше 1.Следовательно, он никогда не обрабатывает первый элемент массива.Вам нужно исправить эту часть.

0 голосов
/ 29 сентября 2018

Я думаю, что вы неправильно оценили некоторые переменные. Ваша переменная j никогда не достигает индекса 0, чтобы сравнить 7 с любым другим значением в этой сортировке сравнения.

Изменение:

for(int i = h +1 ;i < size;i++) до for(int i = h ;i < size;i++)

И

while(j > 0) до while(j >= 0)

else { j = 0; }

до else{ j = -1; }

Итоговый код выглядит так:

` void segmentedInsertionSort(int arr[], int size, int h)
{
    int temp;

    for(int i = h  ;i < size;i++)
    {
        int j = i-h ;


        while(j >= 0)
        {
            if(arr[j+h] < arr[j])
            {
                temp = arr[j];
                arr[j] = arr[j+h];
                arr[j+h] = temp;
                j = j - h;
            }
            else
            {
                j = -1;
            }
        }
    }
}
void shellSort(int arr[], int size)
{
    int h = size/2;

    while(h > 0)
    {
        print(arr);
        segmentedInsertionSort(arr,size,h);
        h = h/2;
    }            
}
...