当前位置: 首页 > 知识库问答 >
问题:

我无法获得排序列表中的第一个值

柯阳曦
2023-03-14

我正在进行shell排序,但无法对列表中的第一个值进行排序。例如如果列表{7,2,6,4,5),则在对列表{7,2,4,5,6}进行排序之后。你们能帮忙吗!公共静态void segmentedInsertionSort(int[]list,int n,int h){int 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;
    }

}

共有2个答案

包谭三
2023-03-14

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

要解决这个问题,请尝试使用do{}while(j)

做虽然将首先执行内部块,然后检查while语句是true还是false。

我在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的方法,但可惜失败了。

王亮
2023-03-14

首先,查看维基上的shellSort。

因为j索引从不检查0索引元素,所以第一个元素从不与后面的元素进行比较。对于更整洁的版本,请参阅此处。

错误更正如下。

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

}
 类似资料:
  • 问题内容: 我尝试编写xpath表达式,以使我的测试不会因小的设计更改而中断。因此,我编写了自己的表达式,而不是Selenium IDE生成的表达式。 这是一个问题: 此表达式根本不起作用。名为“问题”的输入节点分布在整个页面上。他们不是兄弟姐妹。 我尝试使用中间表达式,但是也失败了。 这就是为什么我认为Seleniun具有错误的XPath实现。 根据XPath文档,位置谓词必须按 节点 集中的位

  • 我正在做一个项目,所以我把我的问题简化为: 任何帮助都将不胜感激。

  • 我想从给定客户的应用程序列表中删除一个服务主体(Azure AD应用程序),因此我使用https://graph.microsoft.com/beta/servicePrincipials查询租户中的服务主体列表 问题是,我可以看到很多应用程序,但不是我们正在工作的一个。该应用程序不是通过Azure门户手动添加的,而是通过显示给客户的管理同意对话框添加的,以便向我们的应用程序授予访问Azure A

  • 问题内容: 我想知道是否可以获取列表或集合的第一个元素。使用哪种方法? 问题答案: Collection c; (这是获得a的“第一个”元素的最接近的位置。您应该意识到,它对于的大多数实现绝对没有任何意义。这可能对LinkedHashSet和TreeSet有意义,但对HashSet没有意义。)

  • 我想要列列表和它的表名在数据库中的列具有所有空值。 此表太大,有些列只有空值。 我想要一个存储过程,列出表中没有任何数据的列(即NULL)。 这样我就可以削减列的数量。 我只是展示了几个专栏,这样你就可以阅读了。原始表有324列和数百万行数据。对于该代码来说,性能不是一个紧迫的问题。我需要这个只是为了内部目的。 这是mysql解决方案,我需要一个SQL服务器解决方案

  • 注意:我不想使用任何库。试图解决https://icpc.kattis.com/problems/stacking 在以下条件下,合并排序数组所需的最小操作数是多少: 拆分:可以将单个堆栈拆分为两个堆栈,方法是将堆栈的任何顶部提起并放在一边,形成一个新堆栈。 连接:两个堆栈可以通过将一个放在另一个上面来连接。仅当顶部堆叠的底板不大于底部堆叠的顶板时,才允许这样做,也就是说,必须正确订购连接的堆叠。