`
薛定谔
  • 浏览: 22411 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

原地快速排序

 
阅读更多

原地快速排序的步骤如下:

    1. 取序列中的任意值作为一个基准值;

    2. 将该基准值与序列的头或者尾进行交换;

    3. 将基准值之外的其他值与基准值进行比较,小于基准值的交换到序列前面,大于基准值的交换到序列后面;

    4. 将基准值交换到序列的分界线处;

    5. 将序列按基准值分为两部分分别进行快速排序;

 

 

代码如下:

private void quickSortInPlace(int[] s, int startIndex, int endIndex){
    if(s == null || s.length < 2){
        return;
    }

    if(startIndex >= endIndex || endIndex >= s.length || startIndex < 0){
        return;
    }

    int pivot = s[startIndex];
    int pivotIndex = startIndex;
    swap(s, startIndex, endIndex);
    for(int i=startIndex; i<endIndex; i++){
        if(s[i] < pivot){
            if(i != pivotIndex){
                swap(s, i, pivotIndex);
            } 
            pivotIndex++;
        }else if(s[i] > pivot){
            continue;
        }
    }
  
    swap(s, pivotIndex, endIndex);
    
    if(pivotIndex > startIndex+1){
        quickSortInPlace(s, startIndex, pivotIndex-1);
    }
    
    if(pivotIndex < endIndex -1){
        quickSortInPlace(s, pivotIndex+1, endIndex);
    }
}

//将数组s中i和j的位置进行调换
private void swap(int[] s, int i, int j){
    int temp = s[i];
    s[i] = s[j];
    s[j] = temp;
}

    

0
2
分享到:
评论

相关推荐

    Java快速排序算法.pptx.pptx

    快速排序原理 快速排序是一种采用分治法策略的高效排序算法,其基本思想是选取一个基准元素,将数组分为两部分,使得一部分的元素都小于基准元素,另一...此外,快速排序是一种原地排序算法,不需要额外的存储空间。

    【算法】一个小白的算法笔记:快速排序算法的编码和优化.pdf

    快速排序算法的编码和优化 快速排序的基本思路是: 1. 先通过第一趟排序,将数组原地划分为两部分,其中一部分的所有数据都小于另一部分的所有数据。原数组 被划分为2份 2. 通过递归的处理, 再对原数组分割的两...

    C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码

    快速排序是基于分治思想的原地排序的排序算法,将长度为N的数组排序所需时间和NlgN成正比,而且内循环比大多数排序算法都要短小和简单,因此一般情况比其他排序算法效率高。它的缺点是非常脆弱,某些情况可能导致它...

    浅谈快速排序算法的改进 (2012年)

    快速排序是冒泡排序经改进之后的一种新的排序方法。拥有速度快,原地排序等特点,本文主要探讨了对原始的快速排序的一些改进的想法,提高其效率。

    几种简单排序算法的实现以及时间比较

    选择排序 二分排序 及时终止的选择排序 冒泡排序 及时终止的冒泡排序 快速排序 插入排序 希尔排序 堆排序 利用附加数组重排数组元素 原地重排数组元素

    一种快速线性原地二路归并算法* (2005年)

    将内部缓冲技术、浮洞技术与分治技术相结合,...如进一步降低系数,并与其他好的排序算法有机结合,理论上的原地二路归并算法必将成为比快速排序更实用的算法。因此该线性原地二路归并算法具有较高的理论和实用价值。

    一种基于数据块交换的快速稳定原地归并算法① (2004年)

    与其它排序算法相比,二路归并最适合于对2个有序子表进行排序。归并长度分别为m和n的2个有序子...提出了一种基于块交换的快速稳定原地二路归并算法。实验证明,该算法与以前的原地算法相比,大大降低了元素的移动次数。

    python 常见的排序算法实现汇总

    要求能够手写时间复杂度位O(nlogn)的排序算法:快速排序、归并排序、堆排序 1.冒泡排序 思想:相邻的两个数字进行比较,大的向下沉,最后一个元素是最大的。列表右边先有序。 时间复杂度$O(n^2)$,原地排序,稳定的...

    leetcode分类-algotithm:算法复习

    4.快速排序 .普通快速排序 .双路快速排序 .三路快速排序 5.冒泡排序法 6.希尔排序法 7.堆排序法 (2)查找算法 1.线性查找法 2.二分查找法 对于有序数列,才能使用二分查找法 .使用递归的方式实现二分查找 .使用循环的...

    leetcode下载-algorithm:算法数据结构学习

    快速排序 O(n*logn) 否 是 归并排序 O(n*logn) 是 否 计数排序 O(n+k) k是数据范围 是 否 桶排序 O(n) 是 否 基数排序 O(dn) d是维度 是 否 冒泡排序和插入排序的时间复杂度都是O(n2),都是原地排序算法,都是稳定的...

    leetcode走方格起点到终点-leetcode:编程算法题(python解题)

    快速排序patition(只有三种元素简化版),三路快速排序(维护三个指针,一头一尾一遍历) 遍历一遍  注意计数排序要保持稳定,最后找位置应从后往前 把有序数组num2(len=N),合并到有序数组num1(len=M+N, 前M...

    算法第四版-PDF-网盘链接

     2.3 快速排序 182  2.3.1 基本算法 182  2.3.2 性能特点 185  2.3.3 算法改进 187  2.4 优先队列 195  2.4.1 API 195  2.4.2 初级实现 197  2.4.3 堆的定义 198  2.4.4 堆的算法 199  ...

    leetcode中文版-Algorithms-Learning-Python:我学习算法的过程中编写的代码和笔记(Python实现)

    【算法日积月累】6-快速排序 (同上) 【算法日积月累】7-两路快排 (同上) (同上) 【算法日积月累】8-三路快排 (同上) (同上) 第 2 部分:堆与优先队列 【算法日积月累】9-堆与优先队列 (同上) 【算法...

    算法-第4版-完整版

    5.1.4 三向字符串快速排序 467 5.1.5 字符串排序算法的选择 470 5.2 单词查找树 474 5.2.1 单词查找树 475 5.2.2 单词查找树的性质 483 5.2.3 三向单词查找树 485 5.2.4 三向单词查找树的性质 ...

    算法 第4版-谢路云译-带完整书签

    5.1.4 三向字符串快速排序 467 5.1.5 字符串排序算法的选择 470 5.2 单词查找树 474 5.2.1 单词查找树 475 5.2.2 单词查找树的性质 483 5.2.3 三向单词查找树 485 5.2.4 三向单词查找树的性质 487 ...

    算法 第4版 高清中文版

    5.1.4 三向字符串快速排序 467 5.1.5 字符串排序算法的选择 470 5.2 单词查找树 474 5.2.1 单词查找树 475 5.2.2 单词查找树的性质 483 5.2.3 三向单词查找树 485 5.2.4 三向单词查找树的性质 487 5.2.5 应该...

    Python3实现从排序数组中删除重复项算法分析

    题目:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 方案一:...

    《算法》中文版,Robert Sedgewick,塞奇威克

    5.1.4 三向字符串快速排序 5.1.5 字符串排序算法的选择 5.2 单词查找树 5.2.1 单词查找树 5.2.2 单词查找树的性质 5.2.3 三向单词查找树 5.2.4 三向单词查找树的性质 5.2.5 应该使用字符串符号表的哪种实现 ...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    5.1.4 三向字符串快速排序 5.1.5 字符串排序算法的选择 5.2 单词查找树 5.2.1 单词查找树 5.2.2 单词查找树的性质 5.2.3 三向单词查找树 5.2.4 三向单词查找树的性质 5.2.5 应该使用字符串符号表的哪种实现 ...

    数据结构(C++)有关练习题

    请编写一个函数将这个线性表原地逆置,即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,e2,e1,e0)。 2、 针对带附加头结点的单链表,试编写下列函数: A. 定位函数Locate:在单链表中寻找第i个结点。若找到...

Global site tag (gtag.js) - Google Analytics