数据结构-挖坑填数+分治法解决快速排序问题(java+c)
文章目录
- 一、定义
- 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)相关推荐
- 分治法解决组合总和问题(leetcode216)
nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...
- 分治法解决棋盘覆盖问题
分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...
- 分治法解决最大子数组问题
分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...
- 一头扎进算法导论-快速排序(挖坑填数策略)
定义:它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到 ...
- 分治法解决循环赛日程表
分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...
- 快速排序(Quick Sort)—挖坑填数法
前面的博文讲了冒泡排序.选择排序.插入排序,今天我们谈谈快速排序! 快速排序的基本思想是: 1.先从序列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它 ...
- 分治法解决矩阵乘法问题
分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...
- 分治法解决最小套圈问题
/* Copyright by ZhongMing-Bian Jan,6,2010 */ /* 分治法解决最小套圈问题 ...
- 【数据结构与算法设计-基础向】C/C++编程练习 - 套圈(分治法解决最近对问题)
题目: Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at s ...
最新文章
- Where art thou
- 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)
- 一口气说出 4种 “附近的人” 实现方式,面试官笑了,嘿嘿
- 打开DataGrip显示Load Data Ctrl+F5解决方案
- layui弹出层html,layui-弹出层
- Asp.Net中global.asax文件的描述
- 【排序】LeetCode 75. Sort Colors
- Atitit mq读取队列信息 范例 目录 1.1. 读取原理与主要流程	1 1.2. 范例项目 C:\0wkspc\MqDemoPrj	1 1.3. 范例代码	1 1.1.读取原理与主要流程
- CSDN会员免费拿,实现CSDN会员自由的机会到了!!!
- GridView排序状态保持
- 怎么把cad的图导入ps_如何将CAD图纸导入到Photoshop中编辑
- 创建订单 / 下单接口参数说明
- 力扣(LeetCode)怎么刷题,以排序算法为例
- 蜗牛君漫聊设计模式---建造者模式
- python 一组数据 正态分布散点图_R语言入门之散点图
- 东软慧聚助力汽车“芯”节能减排
- 简单了解WBS(工作分解结构)
- 我用Python量化了1000万次散户操作,然后反着来,胜率竟然高达...?! | 你可以永远相信散户!
- 2016年港澳台研究生招生考试报名注意事项
- 上海光机所在探索光学记忆效应的本质及其应用方面取得进展
热门文章
- 操作系统的初始化流程简图
- 慢慢聊Linux AIO
- 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
- c语言为正数无限大,无限大整数相加算法的C语言源代码
- nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
- python关闭csv文件_使用Python编辑csv文件时跳过标题
- redis setnx 分布式锁_Spring Boot 整合 Redis 正确的实现分布式锁
- 拼音表大全图_一年级语文26个汉语拼音字母表读法+写法+笔顺,孩子现在正需要...
- Nginx安装成Windows服务
- Android控件之ConstraintLayout详解