文章目录

  • 一、定义
    • 1.分治法
    • 2.挖坑填数
    • 3.快速排序思想
  • 二、代码实例
    • 1.Java
    • 2.c语言

看到网上有很多的讲解,决定自己整理一遍
首先上定义

一、定义

1.分治法

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法

简单的说就是,大的问题划分成一块一块的几个小问题,把小的问题解决了合并起来就是原问题的解

有人会问,递归和分治一样吗?其实他们是有区别的,递归是自己调用自己而分治是上面说的那样,因为递归和分治经常要一起用到,所以有些人误解递归和分治是一样的

2.挖坑填数

推荐:https://blog.csdn.net/MoreWindows/article/details/6684558?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

3.快速排序思想

快速排序(quick sort)是由冒泡排序改进而得的,他的基本思想是在待排序的n个元素中任意取一个元素(通常取第一个元素)作为基准,把该元素放入适当位置后,数据序列被此元素划分为两部分。
所有关键字比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分,并把该元素排在这两部分的中间(成为元素归位),这个过程称为一趟快速排序,即一趟划分。

之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或空为止

通俗易懂:
1.从数列中取出一个数作为基准数(第一个数)

2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边 或者说,将大于等于这个数的放到它的右边,小于它的数全放到它的左边

3.再对左右区间重复第二步,直到各区间只有一个数或空为止

二、代码实例

1.Java

//java代码1:
public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出递归的条件,每次遍历当左边等于右边的时候退出,即i==j,i==j的位置就是当前轮基元素的位置int i = left,j = right, base = array[left];//设定基准为base , left == 0while(i<j) {//从两边遍历到中间,直到i=j位置,这一行和if(left<right){}一样,只不过是用i替换了left,用j替换了rightwhile(i<j && array[j]>=base)//如果遍历的元素比base大就继续找,j--,找到为止,或者到i==j为止j--;array[i] = array[j];//如果找到比base小的元素,就把j位置的值赋给i,j变成了一个坑,即比基元素小的到了基元素的前面while(i<j && array[i]<=base)//从左向右找,如果遍历的元素比base小就继续找,i++i++;}array[i] = base;//第一轮完事之后,i==j将基元素的位置重新确定,讲整个序列分为两个区间sort(array,left,i-1);//遍历左区间sort(array,i+1,right);//遍历右区间}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}}
//java代码2:
public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出递归的条件int i = left,j = right, base = array[left];//设定基准为basewhile(i<j) {//从两边遍历到中间,直到i=j位置while(i<j && array[j]>base)//从右向左找,如果遍历的元素比base大就继续找,j--j--;if(i<j){//必不可少array[i] = array[j];//如果找到比base小的元素,就把j位置的值赋给i,j变成了一个坑,即比基元素小的到了基元素的前面i++;//转换到从左向右找,不用找相等的元素了}while(i<j && array[i]<base)//从左向右找,如果遍历的元素比base小就继续找,i++i++;if(i<j){array[j] = array[i];//如果找到比base大的元素,就把i位置的值赋给j,i变成了一个坑,上一个坑j被填满了,即比基元素大的到了基元素的后面j--;//转换到从右向左找,不用找相等的元素了}}array[i] = base;//第一轮完事之后,i==j将基元素的位置重新确定,讲整个序列分为两个区间sort(array,left,i-1);//遍历左区间sort(array,i+1,right);//遍历右区间}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}}

运行结果:4 5 6 7 8 9

2.c语言

//c语言代码1
#include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;array[i] = array[j];while(i<j && array[i]<=base)i++;array[j] = array[i];array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);}
}void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);}
}

//c语言代码2
#include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;if(i<j) {array[i] = array[j];i++;}while(i<j && array[i]<=base)i++;if(i<j) {array[j] = array[j];j--;}array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);}
}void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);}
}

运行结果:4 5 6 7 8 9

数据结构-挖坑填数+分治法解决快速排序问题(java+c)相关推荐

  1. 分治法解决组合总和问题(leetcode216)

    nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...

  2. 分治法解决棋盘覆盖问题

    分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...

  3. 分治法解决最大子数组问题

    分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...

  4. 一头扎进算法导论-快速排序(挖坑填数策略)

    定义:它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到 ...

  5. 分治法解决循环赛日程表

    分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...

  6. 快速排序(Quick Sort)—挖坑填数法

    前面的博文讲了冒泡排序.选择排序.插入排序,今天我们谈谈快速排序! 快速排序的基本思想是: 1.先从序列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它 ...

  7. 分治法解决矩阵乘法问题

    分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...

  8. 分治法解决最小套圈问题

    /*     Copyright    by ZhongMing-Bian     Jan,6,2010   */ /*             分治法解决最小套圈问题                 ...

  9. 【数据结构与算法设计-基础向】C/C++编程练习 - 套圈(分治法解决最近对问题)

    题目: Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at s ...

最新文章

  1. Where art thou
  2. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)
  3. 一口气说出 4种 “附近的人” 实现方式,面试官笑了,嘿嘿
  4. 打开DataGrip显示Load Data Ctrl+F5解决方案
  5. layui弹出层html,layui-弹出层
  6. Asp.Net中global.asax文件的描述
  7. 【排序】LeetCode 75. Sort Colors
  8. Atitit mq读取队列信息 范例 目录 1.1. 读取原理与主要流程 1 1.2. 范例项目 C:\0wkspc\MqDemoPrj 1 1.3. 范例代码 1 1.1.读取原理与主要流程
  9. CSDN会员免费拿,实现CSDN会员自由的机会到了!!!
  10. GridView排序状态保持
  11. 怎么把cad的图导入ps_如何将CAD图纸导入到Photoshop中编辑
  12. 创建订单 / 下单接口参数说明
  13. 力扣(LeetCode)怎么刷题,以排序算法为例
  14. 蜗牛君漫聊设计模式---建造者模式
  15. python 一组数据 正态分布散点图_R语言入门之散点图
  16. 东软慧聚助力汽车“芯”节能减排
  17. 简单了解WBS(工作分解结构)
  18. 我用Python量化了1000万次散户操作,然后反着来,胜率竟然高达...?! | 你可以永远相信散户!
  19. 2016年港澳台研究生招生考试报名注意事项
  20. 上海光机所在探索光学记忆效应的本质及其应用方面取得进展

热门文章

  1. 操作系统的初始化流程简图
  2. 慢慢聊Linux AIO
  3. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
  4. c语言为正数无限大,无限大整数相加算法的C语言源代码
  5. nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
  6. python关闭csv文件_使用Python编辑csv文件时跳过标题
  7. redis setnx 分布式锁_Spring Boot 整合 Redis 正确的实现分布式锁
  8. 拼音表大全图_一年级语文26个汉语拼音字母表读法+写法+笔顺,孩子现在正需要...
  9. Nginx安装成Windows服务
  10. Android控件之ConstraintLayout详解