将原问题划分成若干个规模较小而结构与原问题一致的子问题;递归的解决这些子问题,然后在合并其结果,就得到原问题的解
 容易确定运行时间,是分治算法的优点之一。
 分治模式在每一层都递归上都有三个步骤:
 -分解:将原问题分解成一系列的子问题
 -解决:递归的解决子问题,若子问题足够小,则直接有解。
 -合并:将子问题的结果合并成原问题的解

分治的关键点
 -原问题可以一直分解为形式相同的子问题,当子问题规模较小时可以自然求解。
 -子问题的解通过合并可以得到原问题的解。
 -子问题的分解以及解的合并一定是比较简单的,否者分解和合并所花的时间可能超过暴力解法,得不偿失。

快速排序算法

1.分解:数组A[p..r]被划分为两个子数组A[P..q-1]和A[q+1..r]使得A[q]为大小居中的数,使得左侧A[p..q-1]中的每个元素都小于他,右侧A[q+1..r]中的每一个元素都大于他。其中计算下标 q也是划分的一部分。

2.解决:通过递归调用快速排序,对子数组A[p..q-1],A[q+1..r]进行排序

3.合并:数组A[q..r]已经有序所以不需要排序

划分之一遍单项扫描分区法:

-一遍单项扫描法的思路是:用两个指针将数组划分为三个区间,

-扫描指针左边是确认小于等于主元的

-末指针右边是用来放大于主元的元素

import java.util.Arrays;import lanqiao.Swap;public class QuickSort {public static void main(String[] args) {// TODO Auto-generated method stub//int arr[] = new int[5];//Swap.ArryRandom(arr, 5);//System.out.println(Arrays.toString(arr));int[] brr = new int[]{9,5,6,8,4};quicksort(brr,0,brr.length-1);System.out.println(Arrays.toString(brr));}public static void quicksort(int[] arr, int start, int end) {if(start<end) {//递归的出口int q = partition(arr,start,end);//找到主元数组下标quicksort(arr,start,q-1);//对左边进行快排,quicksort(arr,q+1,end);//对右边进行快排}}//找主元public static int partition(int arr[],int start,int end) {int zuyuan = arr[start];//主元初始化int sp = start+1;//左侧扫描指针int bigger = end;//右侧末指针//两个指针交错说明数组已经扫描完了while(sp<=bigger) {if(arr[sp]<=zuyuan) {//扫描指针所指元素比主元小或者相等sp++;}else {//扫描指针所指元素比主元大Swap.swap(arr,sp,bigger);bigger--;}}Swap.swap(arr, start, bigger);//把主元放到bigger这个位置,这样bigger左边都小于主元,右边都大于主元return bigger;}
}

分治法典型体现之快速排序(一遍单项扫描)相关推荐

  1. 算法--分治法归并排序 python

    设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...

  2. 详解分治法(divide-and-conquer)及其典型应用

    什么是分治法 在昨天的文章<漫谈数据库中的join>的最后,提到Grace hash join和Sort-merge join都是基于分治思想的.分治法(divide-and-conque ...

  3. C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。

    )输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...

  4. 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

    分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...

  5. 1177: 按要求排序(指针专题)_数据结构 8 基础排序算法详解、快速排序的实现、了解分治法...

    快速排序 快速排序与冒泡排序一样,同样是属于 交换排序 叫做快速排序也是有原因的.因为它采用了 分治法的概念 其中最重要的一个概念就是 基准元素 冒泡排序每一轮将一个最大的元素挑选出并移动到右侧. 分 ...

  6. 算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题

    一.名称 分治法应用 二.目的 1.掌握分治法的基本思想: 2.学会运用分治法解决实际系统设计应用中碰到的问题. 三.要求 1.实现基于分治法思想的合并排序: 2.实现基于分治法思想的快速排序: 3. ...

  7. 分治法:快速排序棋盘覆盖

    目标 使用分治法解决快速排序问题 使用分治法解决棋盘覆盖问题 原理 一.快排原理 排序算法在工作中最常用,也是学习很多其他算法的前置知识,例如在运用二分查找算法之前,我们通常需要保证数据是有序的,如果 ...

  8. C语言实现快速排序法(分治法)

    title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...

  9. 分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍

    分治法在二叉树遍历中的应用 二叉树本身就是由两个更小的部分组成--左子树和右子树,所以二叉树的问题非常适合用分治法来解决. 二叉树的高度:从叶子到根之间的最长路径.我们可以理解为根的左子树高度和右子树 ...

最新文章

  1. 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
  2. php上传图片 中文,php图片上传方法
  3. 【Xamarin开发 Android 系列 5】 Xamarin 的破解
  4. springcloud 服务与服务之间实现灰度发布 基于Aspect
  5. php 快速找到php.ini位置
  6. swing学习一(swing介绍、swing样例、布局管理器)
  7. 一个核心系统 3 万多行代码的重构之旅
  8. 无效的变量名c语言,变量方法用法 _C语言-w3school教程
  9. Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程
  10. 2021-08-30缺失的第一个正数
  11. [2018.07.24 T3] 大原题
  12. python数据透视表怎么存下来_大数据分析如何利用Python创建数据透视表?
  13. 纪检委,检察院的工资
  14. 【Unity3D基础2-11】Unity3D网格和材质
  15. Python海龟画图 画一个爱心 赶快给女朋友来一个
  16. linux磁盘第一个扇区分析,[转]Linux中如何读写硬盘上指定物理扇区
  17. kappa系数在评测中的应用
  18. Java中将String转成Long或long
  19. python开发简历自我介绍范文_你们简历上的自我介绍怎么写的?
  20. pyspark- ml-features

热门文章

  1. Python 的神奇方法指南
  2. 中山大学 2013-2014 校历
  3. 设置Webview的页面缩放大小
  4. 飞飞CMS仿优酷网站模板V1.6版
  5. Android闲鱼版本大全,闲鱼下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
  6. 高等数学:8.1 向量及其线性运算
  7. i7 9700k和i9 9900k 哪个好
  8. 电脑无法连接隐藏式wifi
  9. 酷比魔方talk8x官方线刷教程疑问解析
  10. 诗词必考意象盘点 | 菊花