【问题标题】:I could not be able to get the first value in a list sorted我无法获得排序列表中的第一个值
【发布时间】:2014-02-23 22:04:15
【问题描述】:

我正在处理 shell 排序,但我无法获得排序列表中的第一个值。例如。 if list{7, 2 ,6, 4, 5),排序后的 list{7, 2, 4,5,6}。请各位大神帮忙!公共静态无效分段插入排序(int []列表,int n,int h) { 整数 j;

     int temp;
    for(int i = h; i < n; i++)
    {

        j = i - h;
        while(j >0)
        {
            if (list[j] > list[j + h]))
            { 
                temp = list[j];
                list[j] = list[j + h];
                list[j + h] = temp;
                j = j - h;


            }
            else
            {
                j = 0;
            }
        }
    }
}



public static void shellSort(int[] list, int n)
{
    int h = 1;
    while (h < n/3)
    {
        h = h*3 +1;
    }

    while(h > 0)
    {
        segmentedInsertionSort(list, n, h);
        h = (h - 1)/3;
    }

}

【问题讨论】:

  • 你能给你的变量起更多描述性的名字,这样我们就知道它们代表什么

标签: sorting shellsort


【解决方案1】:

首先,检查wiki 的shellSort。

由于 j 索引从不检查 0 索引元素,因此第一个元素永远不会与后面的元素进行比较。如需更简洁的版本,请参阅here

Bug 已修正如下。

segmentedInsertionSort(int[] list, int n, int h) {
   .
   .
   while(j >= 0) {
   .
   .
   .
    else
    {
      j = -1;
    }

}

【讨论】:

    【解决方案2】:

    7在索引0的位置,如果j = 0,你的while语句不会执行。

    要解决这个问题,请尝试do { } while (j &lt; 0);

    do...while... 将首先执行内部块,然后检查 while 语句是真还是假。

    我在 perl 中对此进行了测试。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @list = (7, 2, 6, 4, 5);
    
    my @newList = shellSort(\@list, $#list);
    
    for (@newList){
        print "$_ ";
    }
    
    
    sub shellSort{
        my @list = @{ $_[0] };
        my $length = $_[1];
        my $gap = 1;
        while($gap < $length/3){
            $gap = ($gap*3) +1;
        }
    
        while($gap > 0){
            @list = segmentedInsertionSort(\@list, $length, $gap);
            $gap = ($gap - 1)/3;
        }
        return @list;
    }
    
    sub segmentedInsertionSort {
        my ($li, $length, $gap) = @_;
        my @list = @{ $li };
    
        my $j;
        my $temp;
        for my $i ($gap .. $length){
            $j = $i - $gap;
            do{
                if($list[$j] > $list[$j + $gap]){
                    $temp = $list[$j];
                    $list[$j] = $list[$j + $gap];
                    $list[$j + $gap] = $temp;
                    $j = $j - $gap;
                }
                else {
                    $j = 0;
                }
            }
            while ($j > 0);
        }
        return @list;
    }
    

    编辑: 其实这个实现是有问题的,想尝试一种不同于设置 j = -1 的方式,但是很可惜,失败了。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多