美文网首页
快速排序の单向扫描法

快速排序の单向扫描法

作者: 掌灬纹 | 来源:发表于2019-01-31 09:30 被阅读0次

工程上的排序大多使用复杂度为O(nlgn)即快排的方式。

简介快排即为三部:

1.定主元位置划分(划分为两部分左边都比主元小,右边都大)

2.递归的解决两边的问题。同1

3.合并(快排因为划分的原因不在需要合并)

单向扫描法思路:

1.定主元pivot

2.扫描指针sp,尾指针bigger

3.<=pivot sp右移

  > pivot与bigger当前元素交换,bigger左移

  边界:sp > big 交错 跳出 将主原 与 bigger元素交换 最后返回bigger(主元位置)

(Java代码示例)

static void quickSort(int[] arr, int p, int r) {

if(p < r) {//递归出口

int q = partition(arr, p, r);//定主元位置

quickSort(arr, p, q-1);//左侧递归排序

quickSort(arr, q+1, r);//右侧递归排序

}

}

static int partition(int[] arr, int p, int r) {//单向扫描定主元位置

int pivot = arr[p];//数组的第一个元素为主元大小

int sp = p + 1;//扫描指针

int bigger = r;//右侧指针

while(sp <= bigger) {//两指针交错跳出循环

if(arr[sp] <= pivot) {//<=主元素,扫描指针右移

sp++;

}else{//>主元素,当前元素与右侧指针交换,右侧指针左移

swap(arr, sp, bigger);

bigger--;

}

}

swap(arr, p, bigger);//主元素放到合适的位置(bigger指针)

return bigger;//主元素位置 且数组左边都小于主元素 右边都大于主元素

}

static void swap(int[] arr, int i, int j) {//交换下标为 i j 的元素

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

相关文章

  • 快速排序の单向扫描法

    工程上的排序大多使用复杂度为O(nlgn)即快排的方式。 简介快排即为三部: 1.定主元位置划分(划分为两部分左边...

  • 排序算法总结

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

  • iOS常见算法

    升序算法:用冒泡排序法 选择排序法 快速排序

  • 排序算法篇_快速排序法

      快速排序(Quick Sort)法和冒泡排序法类似,都是基于交换排序思想的。快速排序对冒泡排序法进行了改进,从...

  • 《python算法教程》Day9 - 快速排序法

    这是《python算法教程》第9篇读书笔记,笔记的主要内容为快速排序法。 快速排序法简介 快速排序法运用分治法的方...

  • 排序算法

    排序算法分类 排序算法常用主要有:冒泡排序法、快速排序法、选择排序法、插入排序法、堆排序法、归并排序法等几种。 ...

  • php实现几种常见的排序方法

    1. 冒泡排序法: 2. 选择排序法: 3.插入排序法: 4.快速排序法:

  • 3种排序

    冒泡排序 插入排序 快速排序法

  • js 常见排序算法(快速排序,选择排序等)

    快速排序法 选择排序 插入排序 冒泡排序

  • 双向链表的快速排序(swift版本)

    面试经常会被问到的单向链表的快速排序or双向链表的快速排序,现在用swift写了一个双向链表的快速排序,直接上代码...

网友评论

      本文标题:快速排序の单向扫描法

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