美文网首页
排序 三 快速排序

排序 三 快速排序

作者: 低吟浅唱1990 | 来源:发表于2019-01-06 09:50 被阅读4次

快速排序是一种分治排序算法。快速排序需要先找到一个基准值v和经过初步交换得到的此基准值v在数组中的下标p,经过初步交换的数组在p之前位置的元素<v,在p之后的元素>v.
寻找v和p的过程叫做切分(partition)。然后分别对左半部分和右半部分排序。切分的算法有多种。

一种切分算法
private static <T> int partition(Comparable<T> [] a,int lo,int hi)
{
        
   int i = lo, j = hi+1;  //左右扫面指针
   Comparable<T> v = a[lo];   //切分元素
    while (true) 
    {       //扫描左右,检查扫描是否结束并交换元素
        while(less(a[++i], v)) if (i==hi) break;
        while(less(v, a[--j] )) if(j ==lo)  break;  // 注意数组越界问题
        if(i>= j) break;
        exch(a, i, j);
    }
    exch(a, lo, j);    // 将 v = a[j] 放入正确的位置
    return j;    // a[lo...j-1] <= a[j] <= a[j+1...hi]
}

// 最后得出基准值v和p。接下来需要分别排序j-1之前的元素和j+1之后的元素
void sort(Comparable<T> [] a,int lo,int hi) {
    if (hi <= lo) {
        return;
    }
    int j = partition(a, lo, hi);  // 切分 部分交换了元素位置
    sort(a, lo, j-1);                 //将左半部分排序
    sort(a,j+1,hi);                  //将右半部分排序
}

实际情况数组中可能有大量的重复元素,一个元素全部重复的子数组就不需要继续排序了,但是上文的算法还是继续切分成更小的数组进行排序。因此人们想到可以把数组分成三个部分分别对应小于、等于和大于切分元素的数组元素。

三向切分的快速排序

void sortThreeway(Comparable<T> [] a,int lo,int hi) {
    if(hi <= lo)return;
    int lt = lo,i = lo+1, gt = hi;
    Comparable<T> v = a[lo];
    while(i <= gt){
        int cmp = a[i].compareTo((T) v);
        if(cmp < 0) exch(a, lt++, i++);
        else if (cmp > 0) exch(a, i, gt--);
        else i++;
    }
    sortThreeway(a, lo, lt-1);
    sortThreeway(a, gt+1, hi);
}

a[i] < v ,将a[lt]和a[i]交换,将lt和i加1;
a[i] > v,将a[gt]和a[i]交换,将gt减1;
a[i] = v ,将 i加1

相关文章

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

  • python排序方法

    一、冒泡排序 二、快速排序 三、选择排序

  • 排序算法

    一、冒泡排序 二、选择排序 三、快速排序

  • 排序算法总结

    选择排序法 插入排序法 冒泡排序法 归并排序法 自顶向下 自底向上 快速排序法 单路快速排序法 双路快速排序法 三...

  • Objective-C实现常用的排序算法

    一、冒泡排序: 二、选择排序: 三、快速排序: 四、插入排序:

  • 排序算法(二)

    一.选择排序 二.冒泡排序 三.快速排序 四.算法比较

  • 排序 -- 快排/归并

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 快排/归并 之前的三...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序算法优化

    前面文章分别讲解了冒泡排序,插入排序,选择排序;快速排序,归并排序;桶排序,计数排序,基数排序,三大类排序算法。 ...

网友评论

      本文标题:排序 三 快速排序

      本文链接:https://www.haomeiwen.com/subject/moqjrqtx.html