在此数据{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;
}
}
答案 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;
}
}