Shell排序未对数组的第一个元素进行排序

时间:2018-09-29 20:09:57

标签: java shellsort

在此数据{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 :(得分:1)

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。因此,它永远不会处理数组的第一个元素。您需要修复此部分。

答案 1 :(得分:0)

我认为您对某些变量进行了错误估价。您的变量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;
    }            
}