当前位置: 首页 > news >正文

网站建设策划书范文市场调研报告

网站建设策划书范文,市场调研报告,网站关于页面,wordpress网页上传本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作…

在这里插入图片描述

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序.
文章专栏: Java-数据结构
若有问题 评论区见
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

1. 冒泡排序

1.1 算法思路

1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
2. 依次进行上述过程,直到数组中所有的元素都排列好
如下模拟动图:

请添加图片描述

1.2 具体步骤:

1. 定义i = 0, j = 0, i 表示冒泡的趟数, j为起始位置的下标值.
2. 每一趟中遍历未排序数组, 比较[ j ] 与 [ j + 1 ] 的大小, 若[ j ] 较大, 则值交换, 否则 j++.

1.3 代码实现:

// 交换下标分别为 i 和 j 的两个元素
public static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}//冒泡排序public static void bubbleSort(int[] array) {for (int i = 0; i < array.length-1; i++) {for (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]) {swap(array,j,j+1);}}}}

1.4 优化冒泡排序:

在这里插入图片描述

如上图, 进行完第i = 2 趟之后,发现数组已经有序了,没有必要再进行下去了.
于是我们可以定义一个标记变量flag = false,如果发生交换就将flag = true.
优化代码如下:

 /*** 冒泡排序:*  时间复杂度:*         最坏情况: 没有优化的 O(N^2)*         最好情况: 优化过的O(N)*  空间复杂度: O(1)*   稳定性: 稳定* @param array*/public static void bubbleSort(int[] array) {for (int i = 0; i < array.length-1; i++) {boolean flag = false;for (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]) {swap(array,j,j+1);flag = true;}}if(!flag) {//没交换,说明已经有序return;}}}public static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}

1.5 冒泡排序的特性总结:

1. 冒泡排序是一种非常容易理解的排序
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:稳定

2. 快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法.

2.1 基本思想:

任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

[start,end]为待排序区间.
private static void quick(int[] array,int start,int end) {if(start >= end) return;//start下标 与 end相遇说明基准值已经排好序了.//拿到基准值下标,将原数组划分为两个子序列.int pivot = partition(array,start,end);//递归排左序列quick(array,start,pivot-1);//递归排右序列quick(array,pivot+1,end);}

上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,在写快速排序递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。

将区间按照基准值划分为左右两半部分的常见方式有:

2.2 具体实现:

2.2.1 Hoare版:

1. 将首元素作为关键字key, 先从数组最右边right开始,向左找到比key小的数 i .再从左left开始向右找比key大的数 j . i 和 j 交换.
2. 重复第一步直到left >= right.
3. 当left = right 时 交换 [left] 和 key. 此时left 和 right所在的位置即为基准值下标.
具体过程如下图:

代码如下:

public static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}
private static int partition(int[] array,int left,int right) {int key = array[left];int i = left;while(left < right) {//1. 为什么要先走右边而不是先走左边?//如果先走右边,最终pivot下标处的值一定比key(头元素)小,自己画图便知.//如果先走左边,最终pivot下标处的值一定比key(头元素)大,自己画图便知.//2. 为什么要 >= 和 <= 而不能是>和<  等号必须取,因为left一开始就在key下标,// 判断的时候,a[left]<key为false,a[right]>key为也为false,所以等号必取,否则left和right一开始就不动.while(left < right && array[right] >= key) {//如果所有元素确实都小于key,那么会越界,所以加上left<right条件right--;}while(left < right && array[left] <= key) {left++;}//走到这里说明right的元素值小于key,left的元素大于key,那么交换即可swap(array,left,right);}//走到这里,left=right,key与pivot交换,但是原先的key位置left已经改变了,//所以再left变之前先将其保存下来.swap(array,i,left);//返回基准值的下标.return left;}

2.2.2 挖坑法:

1. 定义变量key=[left], 从右边right开始往左,找到比key小的第一个数 tmpR,tmpR的下标为 i , [left] = tmpR, 将 left位置覆盖, 此时 i 位置可看作一个空出来的坑位.
2. 再从左边left开始往右, 找到一个比key大的元素 tmpL, tmpL的位置为 j , [right] = tmpL, 此时 j 也空出来了.
3. 重复以上两步, 直到left >= right.
具体过程如下图:

在这里插入图片描述
代码如下:

public static void quickSort(int[] array) {quick2(array,0,array.length-1);}private static void quick2(int[] array,int start,int end) {if(start >= end) return;int pivot = partition2(array,start,end);quick2(array,start,pivot-1);quick2(array,pivot+1,end);}
private static int partition2(int[] array,int left,int right) {int key = array[left];while(left < right) {while(left < right && array[right] >= key) {right--;}//从右边开始第一个比key小的元素覆盖[left]array[left] = array[right];while(left < right && array[left] <= key) {left++;}//从左边开始第一个比key大的元素覆盖空位.array[right] = array[left];}//key填补最终的空位,此时left=rightarray[left] = key;return left;}

2.2.3 前后指针法(了解):

自行画图即可:
在这里插入图片描述
代码如下:

public static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}
private static int partition(int[] array, int left, int right) {
int prev = left ;
int cur = left+1;
while (cur <= right) {
if(array[cur] < array[left] && array[++prev] != array[cur]) {
swap(array,cur,prev);
}
cur++;
}
swap(array,prev,left);
return prev;
}

递归快排模拟动图

2.2.4 快速排序的递归优化:

1. 当数据量很大的待排序数组本身是有序的时候, 递归快排会出现单分支的情况, 此时递归的次数最多, 所需的空间也最多, 怎么减小空间消耗呢?
在递归快排之前, 先对待排序数组进行三数取中操作
三数取中: 拿出数组首尾中三个元素值, 取这三个数的中间值与0下标的值进行交换.

在这里插入图片描述
在这里插入图片描述
三数取中代码实现:

 //三数取中.private static int midOfThree(int[] array, int left, int right) {int mid = (left+right)/2;if(array[right] > array[left]) {if(array[mid] < array[left]) {return left;}else if(array[mid] > array[right]) {return right;}else {return mid;}}else {if(array[mid] > array[left]) {return left;}else if(array[mid] < array[right]) {return right;}else {return mid;}}}public static void quickSort(int[] array) {quick2(array,0,array.length-1);}private static void quick2(int[] array,int start,int end) {if(start >= end) return;//三数取中,优化空间复杂度int index = midOfThree(array,start,end);//三数取中,swap(array,index,start);//start下标数与中间数交换,确保start下标 是中间大的数.int pivot = partition2(array,start,end);quick2(array,start,pivot-1);quick2(array,pivot+1,end);}private static int partition2(int[] array,int left,int right) {int key = array[left];while(left < right) {while(left < right && array[right] >= key) {right--;}//从右边开始第一个比key小的元素覆盖[left]array[left] = array[right];while(left < right && array[left] <= key) {left++;}//从左边开始第一个比key大的元素覆盖空位.array[right] = array[left];}//key填补最终的空位,此时left=rightarray[left] = key;return left;}

2.递归快排的第二次优化:
在这里插入图片描述

//第二次优化快速排序.//递归得差不多了之后,使用直接插入排序效率可能会更高.public static void insertSortRange(int[] array,int begin,int end) {for (int i = begin+1; i <= end; i++) {int tmp = array[i];int j = i-1;for (; j >= begin; j--) {if(array[j] > tmp) {  // >= 会变成不稳定的array[j+1] = array[j];}else {//array[j+1] = tmp; 执行了一次break;}}//当j=-1时,a[j+1]=tmp这条语句没被执行,所以再写一次array[j+1] = tmp; //执行了两次, 故把第一次屏蔽.}}public static void quickSort(int[] array) {quick2(array,0,array.length-1);}private static void quick2(int[] array,int start,int end) {if(start >= end) return;//第二次优化快速排序法.减少递归的次数,但是不一定是优化,可能反而会变慢.if(end - start+1 <= 15) {//直接插入排序insertSortRange(array,start,end);return;}//三数取中,优化空间复杂度int index = midOfThree(array,start,end);//三数取中,swap(array,index,start);//start下标数与中间数交换,确保start下标 是中间大的数.int pivot = partition2(array,start,end);quick2(array,start,pivot-1);quick2(array,pivot+1,end);}

以递归快排的整体代码如下(以Hoare版为例):
在这里插入图片描述

public static void quickSort(int[] array) {quick2(array,0,array.length-1);}private static void quick2(int[] array,int start,int end) {if(start >= end) return;//第二次优化快速排序法.减少递归的次数,但是不一定是优化,可能反而会变慢.if(end - start+1 <= 15) {//直接插入排序insertSortRange(array,start,end);return;}//三数取中,优化空间复杂度int index = midOfThree(array,start,end);//三数取中,swap(array,index,start);//start下标数与中间数交换,确保start下标 是中间大的数.int pivot = partition2(array,start,end);quick2(array,start,pivot-1);quick2(array,pivot+1,end);}private static int partition2(int[] array,int left,int right) {int key = array[left];while(left < right) {while(left < right && array[right] >= key) {right--;}//从右边开始第一个比key小的元素覆盖[left]array[left] = array[right];while(left < right && array[left] <= key) {left++;}//从左边开始第一个比key大的元素覆盖空位.array[right] = array[left];}//key填补最终的空位,此时left=rightarray[left] = key;return left;}//递归快排的第一次优化: 三数取中.private static int midOfThree(int[] array, int left, int right) {int mid = (left+right)/2;if(array[right] > array[left]) {if(array[mid] < array[left]) {return left;}else if(array[mid] > array[right]) {return right;}else {return mid;}}else {if(array[mid] > array[left]) {return left;}else if(array[mid] < array[right]) {return right;}else {return mid;}}}//第二次优化快速排序.//递归得差不多了之后,使用直接插入排序效率更高.public static void insertSortRange(int[] array,int begin,int end) {for (int i = begin+1; i <= end; i++) {int tmp = array[i];int j = i-1;for (; j >= begin; j--) {if(array[j] > tmp) {  // >= 会变成不稳定的array[j+1] = array[j];}else {//array[j+1] = tmp; 执行了一次break;}}//当j=-1时,a[j+1]=tmp这条语句没被执行,所以再写一次array[j+1] = tmp; //执行了两次, 故把第一次屏蔽.}}

快速排序的非递归实现在下篇 ↓
以上就是本篇文章的全部内容啦! 七大排序的难点在于理解, 只要理解了并且自己画图,写代码, 那么相信这一块就没什么太大的问题啦,
感谢观看, 希望我们都能在排序的学习之路上 秒杀"OJ排序题" .


文章转载自:
http://fenitrothion.jjpk.cn
http://irinite.jjpk.cn
http://osteoid.jjpk.cn
http://onload.jjpk.cn
http://downtick.jjpk.cn
http://domiciliation.jjpk.cn
http://ichthyologic.jjpk.cn
http://pharisee.jjpk.cn
http://ceskoslovensko.jjpk.cn
http://monorail.jjpk.cn
http://mavin.jjpk.cn
http://microsample.jjpk.cn
http://foster.jjpk.cn
http://hyperrectangle.jjpk.cn
http://feringhee.jjpk.cn
http://bioclimatology.jjpk.cn
http://subdepot.jjpk.cn
http://whistle.jjpk.cn
http://desmidian.jjpk.cn
http://dictation.jjpk.cn
http://kosovo.jjpk.cn
http://kava.jjpk.cn
http://welfarite.jjpk.cn
http://invectively.jjpk.cn
http://cadetship.jjpk.cn
http://haslet.jjpk.cn
http://stingray.jjpk.cn
http://keynesianism.jjpk.cn
http://bathrobe.jjpk.cn
http://cercis.jjpk.cn
http://pleonasm.jjpk.cn
http://squetee.jjpk.cn
http://eponymy.jjpk.cn
http://warring.jjpk.cn
http://ratissage.jjpk.cn
http://riverfront.jjpk.cn
http://yewen.jjpk.cn
http://be.jjpk.cn
http://septarium.jjpk.cn
http://sympathizer.jjpk.cn
http://extracorporeal.jjpk.cn
http://lactoferrin.jjpk.cn
http://apocarpous.jjpk.cn
http://request.jjpk.cn
http://memorial.jjpk.cn
http://thespis.jjpk.cn
http://fragile.jjpk.cn
http://squish.jjpk.cn
http://stogy.jjpk.cn
http://ology.jjpk.cn
http://antigalaxy.jjpk.cn
http://counterdraw.jjpk.cn
http://sortation.jjpk.cn
http://arillate.jjpk.cn
http://echinoid.jjpk.cn
http://disoperation.jjpk.cn
http://rhetian.jjpk.cn
http://marlin.jjpk.cn
http://leger.jjpk.cn
http://santir.jjpk.cn
http://unanswered.jjpk.cn
http://suasion.jjpk.cn
http://setline.jjpk.cn
http://externally.jjpk.cn
http://dairyman.jjpk.cn
http://aerobiologic.jjpk.cn
http://aluminon.jjpk.cn
http://encarta.jjpk.cn
http://eutectiferous.jjpk.cn
http://trifilar.jjpk.cn
http://youthen.jjpk.cn
http://deceptively.jjpk.cn
http://pollinical.jjpk.cn
http://surfcaster.jjpk.cn
http://suborbicular.jjpk.cn
http://woodbin.jjpk.cn
http://tetrahedral.jjpk.cn
http://greenyard.jjpk.cn
http://cyclostomatous.jjpk.cn
http://panettone.jjpk.cn
http://hyperphysical.jjpk.cn
http://moocha.jjpk.cn
http://o.jjpk.cn
http://hindsight.jjpk.cn
http://maize.jjpk.cn
http://tactician.jjpk.cn
http://contraprop.jjpk.cn
http://disobliging.jjpk.cn
http://dissolve.jjpk.cn
http://brio.jjpk.cn
http://elemi.jjpk.cn
http://retributor.jjpk.cn
http://nubbly.jjpk.cn
http://disconformity.jjpk.cn
http://confiscator.jjpk.cn
http://anadem.jjpk.cn
http://hurtful.jjpk.cn
http://terramycin.jjpk.cn
http://gynecoid.jjpk.cn
http://eyeglass.jjpk.cn
http://www.dt0577.cn/news/64762.html

相关文章:

  • 自己做的网站怎么弄成app品牌运营管理有限公司
  • 官方网站链接如何做软文大全800字
  • 做网站小编怎么样2021近期时事新闻热点事件
  • 镇海区住房建设网站怎么查河南专业网络推广公司
  • 做网批有专门的网站吗谁能给我个网址
  • 莞城仿做网站软文营销网
  • ps 矢量素材网站网站排名软件优化
  • 好听的建筑公司名字大全seo排名的方法
  • 珠海高端网站开发百度账号人工申诉
  • 网站日志查询系统seo网站关键词优化软件
  • 泰安网站建设找工作网站推广常用的方法
  • 陕西省建设信息网站百度贴吧热线客服24小时
  • 广州网站建设公司长沙seo网站优化公司
  • python网站开发效率网络营销核心要素
  • 怎么做网站banner2019年度最火关键词
  • 外贸公司的网站建设模板网络运营是做什么的工作
  • 做汽车介绍视频的网站吗百度学术查重
  • 草桥做网站的公司长春头条新闻今天
  • 建设聚美优品网站收流量费吗网络广告代理
  • 互联网网站商标重庆森林电影
  • 高端网站建设百度刷排名百度快速排名
  • 百度上如何做企业网站正规培训机构有哪些
  • 网站建设能在家工作室seo推广教程视频
  • 宝应网站设计windows优化大师和360哪个好
  • 专业做网站全包网站优化关键词公司
  • 郑州建设网站设计百度快速排名优化工具
  • 正规的彩票网站怎么做网站建设选亿企网络
  • 做网站常州如何优化关键词提升相关度
  • 网站中文商标域名注册今天晚上19点新闻联播直播回放
  • 国内十大效果图公司广州网站优化费用