0

当我对这个数据 {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;
        }            
    }
4

2 回答 2

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

于 2018-09-29T20:53:06.640 回答
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;
    }            
}
于 2018-09-29T20:51:21.297 回答