Java 中的就地快速排序

2023-11-29

为了刷新一些 Java,我尝试实现一个可以对整数数组进行排序的快速排序(就地)算法。以下是我到目前为止得到的代码。你可以通过以下方式调用它sort(a,0,a.length-1).

如果两个“指针”都存在,则此代码显然会失败(进入无限循环)i,j每个都指向与枢轴具有相同值的数组条目。枢轴元素v始终是当前分区的最右边(索引最大的分区)。

但我就是不知道如何避免这种情况,有人看到解决方案吗?

static void sort(int a[], int left, int right)   {
    if (right > left){
        int i=left, j=right-1, tmp;
        int v = a[right]; //pivot
        int counter = 0;
        do {
            while(a[i]<v)i++;
            while(j>0 && a[j]>v)j--;

            if( i < j){
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        } while(i < j);
        tmp = a[right];
        a[right] = a[i];
        a[i] = tmp;
        sort(a,left,i-1);
        sort(a,i+1,right);

    }
}    

在执行快速排序时,我强烈建议创建一个单独的分区方法,以使代码更易于理解(我将在下面展示一个示例)。除此之外,避免最坏情况运行时间的一个好方法是在执行快速排序之前对正在排序的数组进行洗牌。此外,我使用第一个索引而不是最后一个索引作为分区项。

例如:

public static void sort (int[] a)
{
    StdRandom.shuffle(a);
    sort(a, 0, a.length - 1);
}

private static void sort(int[] a, int lo, int hi)
{
    if (hi <= lo) return;
    int j = partition(a, lo, hi) // the addition of a partitioning method
    sort(a, lo, j-1);
    sort(a, j+1, hi);
}

private static int partition(int[] a, int lo, int hi)
{
    int i = lo, j = hi + 1, tmp = 0;
    int v = a[lo];
    while (true)
    {
         while (a[i++] < v) if (i == hi) break;
         while (v < a[j--]) if (j == lo) break;
         if (i >= j) break;
         tmp = a[i];
         a[i] = a[j];
         a[j] = tmp;
    }
    tmp = a[lo];
    a[lo] = a[j];
    a[j] = temp;
    return j;
}

除此之外,如果您想要一个关于快速排序如何工作的非常好的示例(作为复习),请参阅here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的就地快速排序 的相关文章

  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • Android ListView 带有复选框和所有可点击的[重复]

    这个问题在这里已经有答案了 可能的重复 Android 将数据库中的数据绑定到ListView中的复选框 我想将 ListView 与具有以下布局的项目一起使用 CB TV TV CB 是一个复选框 TV 是一个 Textview 现在我在
  • 从另一个表单更新 Datagridview

    首先我应该说我看到了这个链接 关闭子窗体时如何刷新datagridview 我确实喜欢这样 我在Form1中有datagridview Form1 public void FillDataGridView DataTable dt1 bin
  • popToViewController 动画自 ios5 起不再有动画

    如主题所述 调用popToRootViewControllerAnimated popToViewControllerAnimated不再做任何动画了 我使用的代码在 4 x 上工作得很好 很简单 self navigationContro
  • Javascript 使用输入创建用户名

    我有一个表单 用户可以在其中输入各种信息 输入选择的名称允许用户输入选择的用户名 但需要集成隐藏输入以便创建系统用户名 系统用户名是通过 JavaScript 函数在页面提交时生成的 它由姓氏 街道地址 名字中的第一个字母字符组成 该月的数
  • JSF 数据表单元格 - 如果内容太长,则剪切文本并替换为“...”

    如果文本对于单元格来说太长 我想剪掉文本 并在末尾添加三个点 不换行 问题是 我不能只在 XX 符号之后剪切 java 中的内容 因为 i 比 W 占用的空间更少 这反过来又看起来很愚蠢 我怎样才能用CSS java实现这一点 如果可能的话
  • 在 .text 部分中定义只读数据的原因是什么?

    我正在学习汇编和低级编程本身并阅读关于它的书 据说我们可以将任何数据放入 text的一部分elf文件 但当然我们不能改变它 因为页面 段的权限不同 但那里没有告诉 其中的原因是什么 里面有数据 text部分 许多 C 程序员还告诉我 g 编
  • Android 的 libGDX 动画

    如果我在桌面上启动它 它运行得很好 但在导出到我的 Android 后 它在我启动应用程序后立即崩溃 所以我的问题 它适用于桌面但不适用于我的 Android 这是怎么回事 public class Player implements Se
  • 我可以让indexOf以不同的方式比较对象吗?

    我想用indexOf但其中的对象List不会是相等的对象 但它们具有相等的值 即它们相等但不相等 我要实现indexOf以不同的方式进行比较Object equals方法 我正在考虑重写 equals 方法以使用我的 us Equivale
  • 如何找到候选键

    我有一个具有函数依赖性的关系 A B C D E 1 A gt BC 2 CD gt E 3 B gt D 4 E gt A 使用 1 得到 A D E 然后使用 4 得到 D E 使用 2 给出 A B C D 然后使用 3 给出 A B
  • 如何装饰子类中所有继承的方法

    class Reader def init self pass def fetch page self with open dev blockingdevice mypage txt as f return f read def fetch
  • 如何在 Chrome 控制台中显示完整对象

    var functor function test functor prop 1 console log functor 这仅显示函子的函数部分 无法在控制台中显示函子的属性 Use console dir 要输出可浏览的对象 您可以单击而
  • Bootstrap 强制表条带化

    我有一张桌子里面有一张桌子 在外面的桌子上我想要条纹和边框 但在里面的桌子上我不需要 我这样做了 table class table table bordered table sm table striped tbody tr td tab
  • 通过 Firebase 通知 API 发送消息时是否可以获取推送通知统计信息,例如递送次数和打开次数?

    我们即将从 Parse com 切换到 Firebase 通知 API 将于 2017 年 1 月停用其服务 以将推送通知发送到我们的 Android 和 iOS 应用程序 我现在的问题是 我看不到有关成功交付次数的任何统计信息 并在 Fi
  • 使用 SQL 高效插入大量数据

    您好 我经常需要将大量数据插入表中 例如 我将从 Excel 或文本文件中获取以下形式的数据 1 a 3 bsdf 4 sdkfj 5 something 129 else 然后我经常在这个例子中构造6条插入语句并运行SQL脚本 我发现当我
  • 如何以编程方式设置网格行和列位置

    我在 Stackpanel 中有两个网格 第一个网格被命名为 GridX 最初 在网格内部 有一个文本框的二维数组 RowDefs ColumnDefs XAML 中的 TextBox 定义是
  • 从聚合迭代 Mongodb 游标

    这是我的 node js 后端的代码 app get getpossibleconnections auth function req res if req authenticated false res send Your session
  • java.lang.NoClassDefFoundError:无法解决

    我在android studio上安装了jrebel for android 启动时出现这个错误 这是我的配置 我的jdk版本 jdk1 8 0 91 编译SDK版本24 buildTools版本 25 0 0 类路径 com androi
  • 作为参数传递给模块函数时,Scriptblock 未获得管道变量绑定

    我想把这个功能 function Test Any CmdletBinding param EvaluateCondition Parameter ValueFromPipeline true ObjectToTest begin any
  • 如何选择shell输出的最后一行

    你好 我有一个像这样的 shell 命令 s3 awk BEGIN print S3 bucket path Executing command queryId sub queryId space q 0 s3 print 10 OFS h
  • Java 中的就地快速排序

    为了刷新一些 Java 我尝试实现一个可以对整数数组进行排序的快速排序 就地 算法 以下是我到目前为止得到的代码 你可以通过以下方式调用它sort a 0 a length 1 如果两个 指针 都存在 则此代码显然会失败 进入无限循环 i