非递归快速排序

2023-12-07

我很想知道我的非递归快速排序算法的实现是否存在一些缺点或隐藏的问题。为了优化它应该修改什么?以我的方式比较两个对象时可能会发生什么问题?

public class QuickSort <T extends Number> {

private Integer first, last, boundLo, boundHi, pivot;
Integer temp[] = {0, 0};

public void sort(NewArrayList<T> vect) {
    Deque<Integer[]> stack = new ArrayDeque<Integer[]>();

    first = 0;
    last = vect.size() - 1;
    stack.push(new Integer[] {first, last});

    while(!stack.isEmpty()) {
        sortStep(vect, stack);  
    }
}

private void sortStep(NewArrayList<T> vect, Deque<Integer[]> stack) {
    // initialize indices
    temp = stack.pop();
    first = temp[0];
    last = temp[1];

    boundLo = first;
    boundHi = last;
    pivot = last;

    while(first < last) {
        if(vect.get(first).doubleValue() >= vect.get(pivot).doubleValue()) {
            last--;
            if(first != last) 
                vect.swap(first, last);         
            vect.swap(last, pivot);
            pivot--;
        }
        else first++;
    }

    if(boundLo < (pivot - 1)) 
        stack.add(new Integer[] {boundLo, pivot - 1});

    if(boundHi > (pivot + 1)) 
        stack.add(new Integer[] {pivot + 1, boundHi});

}

}

ArrayList 是这种排序的最佳集合吗?

public class  NewArrayList<T> extends ArrayList<T> {

public NewArrayList() {
    super();
}

public void swap(int index1, int index2) {
    this.set(index1, this.set(index2, this.get(index1)));
} 
}

考虑建议修改后的代码

public class QuickSort <T extends Number> {

private int first, last, boundLo, boundHi, pivot;
int temp[] = {0, 0};

public QuickSort() {
    super();
}

public void sort(List<T> list) {

    Deque<int[]> stack = new ArrayDeque<int[]>();

    first = 0;
    last = list.size() - 1;

    stack.push(new int[] {first, last});

    while(!stack.isEmpty()) {
        sortStep(list, stack);  
    }
}

private void sortStep(List<T> list, Deque<int[]> stack) {

    temp = stack.pop();
    first = temp[0];
    last = temp[1];

    boundLo = first;
    boundHi = last;
    pivot = last;

    while(first < last) {
        if(list.get(first).doubleValue() >= list.get(pivot).doubleValue()) {
            last--;
            if(first != last) 
                Collections.swap(list, first, last);            
            Collections.swap(list, last, pivot);
            pivot--;
        }
        else first++;
    }

    if(boundLo < (pivot - 1)) 
        stack.add(new int[] {boundLo, pivot - 1});

    if(boundHi > (pivot + 1)) 
        stack.add(new int[] {pivot + 1, boundHi});
}

}

public class Sort {   
    /** Returns a sorted list of attributes. */
    protected int[] sortAttributes1(int[] array) {

        Queue<Range> queue = new ArrayDeque<Range>();

        while (!queue.isEmpty()) {
            Range range = queue.poll();
            if (range.isEmpty()) {
                continue;
            }
            int left = range.getLeft();
            int right = range.getRight();
            // partition the range
            right = partition(array, left, right);
            Range lr = new Range(range.getLeft(), right - 1);
            Range rr = new Range(right + 1, range.getRight());

            queue.add(lr);
            queue.add(rr);
        }
        return array;
    }


    private int partition(int[] array, int left, int right) {
        int pivot = right - left >>> 2;


        while (left <= right) {
            int pivotVal = array[pivot];
            if (array[left] <= pivotVal) {
                left++;
                continue;
            }
            right--;
            if (left == right)continue;
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
        }

        int temp = array[pivot];
        array[pivot] = array[right];
        array[right] = temp;

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

非递归快速排序 的相关文章

随机推荐

  • Laravel (HasMany) 不检索值

    我有以下型号 namespace App use Illuminate Database Eloquent Model class forum category extends Model protected table forum cat
  • 通过Delphi传递SQL Server存储过程参数名称

    我是 Delphi 的新手 正在尝试找到调用 SQL Server 中的一些存储过程的方法 这是我目前正在使用的代码 它有效 FConnection TADOConnection Create nil FMetaDataSP TADOSto
  • 加密脚本中的 MySQL 流量

    我需要能够加密从 Web 服务器到数据库服务器的 MySQL 流量 我知道如何根据 my cnf 中的服务器和客户端设置将 MySQL 设置为使用 SSL 但是 这需要使用 PHP 中的 mysql connect 来完成 这可能是一个由两
  • python 字节数组中的“&”代表什么

    符号是什么意思 意思是在Python的末尾bytearray e g x w bytearray b x00 x00 x04 x12 xaa x12 x12 当将其转换为整数时 int from bytes x w little Out 1
  • 如何增加长时间运行的查询的执行超时?

    在我的应用程序中 执行一个查询需要 3 分钟 我找到默认 ExecutionTimeout 值为 110 秒 我尝试将其更改为 500 秒 但它没有解决我的问题 我在某个地方找到了这个设置
  • 如何从 PHAsset 获取原始图像和媒体类型?

    My GMImagePickerController 返回从照片应用程序中选择的图像的列表 代码如下 void assetsPickerController GMImagePickerController picker didFinishP
  • Pyspark:在 UDF 中传递多列

    我正在编写一个用户定义函数 它将获取数据框中除第一列之外的所有列并进行求和 或任何其他操作 现在 数据框有时可以有 3 列 4 列或更多 它会有所不同 我知道我可以硬编码 4 个列名称作为 UDF 中的传递 但在这种情况下它会有所不同 所以
  • Rails 3.0.3 - Oracle_enhanced 不起作用

    我一直在使用 Ruby 1 8 Rails 2 3 5 和 oracle enhanced 效果很好 现在我最近在另一个文件夹中安装了 Ruby 1 9 2 和 Rails 3 0 3 但无法让它工作 当我创建一个简单的应用程序并访问它时
  • WPF DataGrid 单列中的不同编辑控件

    我正在开发一个 WPF 4 0 应用程序 我需要创建一个网格 其中包含一个带有文本框或下拉列表的列 具体取决于行 例子 Name Value Help PROP1A textbox Description of prop1a Prop2A
  • Android Studio 0.2.6 和 ZBar 项目设置

    我使用的是最新的Android Studio 0 2 6和最新的ZBar Android SDK 到目前为止我所做的 创建了一个名为 QRTest 的全新项目 在我的项目中创建了一个名为 libs 的文件夹 将Zbar libs目录的内容放
  • 如何在不看到权限屏幕的情况下登录 OneDrive(首次登录后)

    我刚刚开始使用 OneDrive API 及其附带的示例程序 OneDriveApiBrowser 正如预期的那样 我第一次登录时 使用 登录到 MSA 系统要求我提供凭据 我的 2 因素代码 最后出现一个权限屏幕 询问我是否批准应用程序想
  • iOS - Google AdMob v6.12.0 - “idfa 类丢失,不会收集 idfa”

    我在 iOS 8 目标 iOS 7 中的一个项目中使用 Google AdMob DFP 和中介插页式广告 尽管我已经包含了我认为 AdMob v6 12 0 所需的所有框架 根据 AdMob 网站 但我在 Xcode 中看到以下警告消息
  • 构建配置特定资源(调试与发布)

    有谁知道一种聪明的方法 最好使用 Eclipse ADT 工作流程 根据项目是调试还是发布构建 即在 Eclipse 中应用程序是运行还是导出 将特定资源应用于项目 我们经常遇到的常见用例是 API 密钥 如地图 最好建立一个项目 专门为所
  • 将多行分组并连接为一行

    我想将所有 文本 行 连接 成一行并得到一行作为结果 这可能吗 我使用 MSSQL Server 2005 使用 FOR XML 路径 SELECT Text AS text FROM table FOR XML PATH 另一种选择 使用
  • 将相机限制在地面覆盖层上?谷歌地图 Android API v2

    我正在尝试向我的用户显示带有标记的地面覆盖层 我试图将视图限制为仅显示地图上的此图像 我希望用户只能将图像视为放置在地图上的地面叠加层 而无法转到周围的地图 如果他们越过边缘 手势就会被阻止 我想要这样的东西 我不想要这个 仅显示地面覆盖地
  • 如何在实践中创建幽灵小工具?

    我正在开发 NASM GCC 针对 ELF64 PoC它使用一个幽灵小工具来测量访问一组缓存行的时间 冲洗 重新加载 如何制作一个可靠的幽灵小工具 我相信我理解 FLUSH RELOAD 技术背后的理论 但在实践中 尽管有一些噪音 我无法生
  • 使用 BinaryFormatter 反序列化加密数据时出现问题

    这是我的代码 public static void Save
  • 控制 C 或 C++ 中的 shell 命令行通配符扩展

    我正在用 C 编写一个程序 foo 它通常在命令行上调用 如下所示 foo txt My main 以正常方式接收参数 在许多系统上 argv 1 从字面上看是 txt 并且我必须调用系统例程来进行通配符扩展 然而 在 Unix 系统上 s
  • 如何将 Handbrake 输出同时输出到屏幕和文件?

    因此 我一直在使用 Handbrake 命令行对我的视频收藏进行编码以存储在我的 NAS 上 这样我就可以在我的 HTPC 上使用它 我一直在寻找一种既可以输出到屏幕的方法 这样我就可以在编码时观察它的输出 也可以输出到文件 这样我就可以返
  • 非递归快速排序

    我很想知道我的非递归快速排序算法的实现是否存在一些缺点或隐藏的问题 为了优化它应该修改什么 以我的方式比较两个对象时可能会发生什么问题 public class QuickSort