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

北京网站优化策略厦门网站关键词优化

北京网站优化策略,厦门网站关键词优化,win8 网站模板,网站对公司的作用是什么目录 直接插入排序 希尔排序 直接选择排序 堆排序 冒泡排序 快速排序 快速排序优化 非递归实现快速排序 归并排序 非递归的归并排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 常见的排序算法有插入排序(直接插入…目录 直接插入排序 希尔排序 直接选择排序 堆排序 冒泡排序 快速排序 快速排序优化 非递归实现快速排序 归并排序 非递归的归并排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 常见的排序算法有插入排序(直接插入排序和希尔排序),选择排序(选择排序和堆排序),交换排序(冒泡排序和快速排序)以及归并排序. 我们将从时间复杂度,空间复杂度,以及排序的稳定性来分析这七大排序. 排序的稳定性 假定在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序是稳定的. 直接插入排序 基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中直到所有的记录插入完为止得到 一个新的有序序列 。 public static void insertSort(int[] array){for (int i 1; i array.length; i) {int tmp array[i];int j i-1;for (; j 0 ; j--) {if (array[j] tmp){array[j1] array[j];}else {break;}}array[j1] tmp;}} 时间复杂度:考虑最坏的情况下,就是全逆序的时候,此时时间复杂度为O(N^2). 最好的情况下,有序的时候,此时时间复杂度为O(N).得出一个结论:当数据量不多,且数据基本上是趋于有序的时候,此时直接插入排序是非常快的. 空间复杂度:O(1) 稳定性:稳定.一个本身就稳定的排序,可以实现为不稳定的排序;但是一个本身不稳定的排序,不能实现为稳定的排序. 希尔排序 希尔排序(缩小增量排序)是直接插入排序的一个优化. 基本思想:先将数据进行分组,将每一组内的数据先进行排序(这一过程叫做预排序);逐渐缩小组数,直到最后整体看作是一组,采用直接插入排序进行排序. 跳着分组的原因:尽可能的使小的数据靠前,大的数据靠后,从而使整体更加趋于有序. public static void shellSort(int[] array){int gap array.length;while (gap 1){gap / 2;shell(array,gap);}}private static void shell(int[] array, int gap) {for (int i gap; i array.length; i) {int tmp array[i];int j i-gap;for (; j 0 ; j-gap) {if (array[j] tmp){array[jgap] array[j];}else {break;}}array[jgap] tmp;}} 当gap1时,都是预排序,目的是让数组更接近于有序.当gap1时,此时数组已经接近有序了,这样进行插入排序就会很快. 希尔排序的时间复杂度不好计算,因为gap的取值方法有很多,导致很难去计算.目前还没有证明gap具体取多少是最快的. 时间复杂度:O(N^1.3),估计的时间复杂度. 空间复杂度:O(1) 稳定性:不稳定. 直接选择排序 基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部排序的数据元素排完. public static void selectSort(int[] array){for (int i 0; i array.length; i) {int minIndex i;for (int j i1; j array.length; j) {if (array[minIndex] array[j]){minIndex j;}}//处理两个下标一样的情况if (i ! minIndex) {int tmp array[i];array[i] array[minIndex];array[minIndex] tmp;}}} 直接选择排序好理解,但是效率低下. 时间复杂度:O(N^2) 空间复杂度:O(1) 稳定性:不稳定 堆排序 排升序要建大堆,排降序建小堆. 升序,建大堆:堆顶元素和最后一个元素交换,将数组长度-1,在对堆顶元素进行向下调整,依次循环. public static void heapSort(int[] array){createBigHeap(array);int end array.length-1;while(end 0){swap(array,0,end);shiftDown(array,0,end);end--;}}//建立大根堆//从最后一颗子树的根节点开始,每一次都进行向下调整private static void createBigHeap(int[] array){for (int parent (array.length-1-1)/2; parent 0 ; parent--) {shiftDown(array,parent,array.length);}}//向下调整private static void shiftDown(int[] array,int parent,int len){int child (2*parent)1;while (child len){if (child1 len array[child] array[child1]){child;}if (array[child] array[parent]){swap(array,child,parent);parent child;child (2*parent)1;}else {break;}}}public static void swap(int[] array,int x,int y){int tmp array[x];array[x] array[y];array[y] tmp;} 时间复杂度:O(n*logn) 空间复杂度:O(1) 稳定性:不稳定 冒泡排序 相邻元素之间的比较. public static void bubbleSort(int[] array){//最外层控制的是趟数//五个数据需要比较四趟for (int i 0; i array.length-1; i) {//加一个标志对冒泡排序进行优化boolean flg false;for (int j 0; j array.length - 1 - i; j) {if (array[j] array[j1]){swap(array,j,j1);flg true;}}if (flg false){break;}}} 时间复杂度:(不考虑优化)O(n^2) 空间复杂度:O(1) 稳定性:稳定 快速排序 快速排序是Hoare 于 1962 年提出的一种二叉树结构的交换排序方法其基本思想为任取待排序元素序列中的某元素作为基准值按照该排序码将待排序集合分割成两子序列左子序列中所有元素均小于基准值右子序列中所有元素均大于基准值然后最左右子序列重复该过程直到所有元素都排列在相应位置上为止。 public static void quickSort(int[] array){quick(array,0,array.length-1);}public static void quick(int[] array,int start,int end){//大于号 是预防1 2 3 4 5 6,直接没有左树或没有右树if (start end){return;}int pivot partition(array,start,end);quick(array,start,pivot-1);quick(array,pivot1,end);}//找基准//Hoare版本private static int partition(int[] array,int left,int right){int i left;int pivot array[left];while (left right){while (left right array[right] pivot){right--;}//right下标的值小于pivotwhile (left right array[left] pivot){left;}//left下标的值大于pivotswap(array,left,right);}//循环走完,left和right相遇//交换 和原来的leftswap(array,left,i);//返回基准return left;} 时间复杂度:O(n*logn) 此时间复杂度不是最坏情况下的时间复杂度,最坏情况下是有序的情况下,此时树的高度是n,时间复杂度是O(n^2),空间复杂度也变成了O(n). 空间复杂度:O(logn) 稳定性:不稳定 挖坑法找基准 private static int partition(int[] array,int left,int right){int pivot array[left];while (left right){while (left right array[right] pivot){right--;}array[left] array[right];while (left right array[left] pivot){left;}array[right] array[left];}array[left] pivot;//返回基准return left;} 挖坑法是找到合适的值直接交换. 需要注意的是挖坑法和hoare找基准的结果是不一样的但是最终都是有序的. 快速排序优化 当数据有序的时候,快速排序的时间复杂度达到最大,而且空间复杂度也会随之改变. 三数取中法 为了使二叉树的划分尽可能的均匀,我们在left,mid,right三个数中,取出中间大的值,来作为key(left). 比如1 2 3 4 5,如果不采用三数取中法,那么1作为key走下来,left和right在1相遇,基准就是1,此时划分的就是单分支的树;如果采用三数取中,将数组顺序调整为 3 2 1 4 5,3作为key,走下来,left和right在中间位置相遇,将3和1交换,变为 1 2 3 4 5,虽然又变回去了,但是此时的基准在中间位置3的地方,此时二叉树划分的将更加均匀. public static void quick(int[] array,int start,int end){//大于号 是预防1 2 3 4 5 6,直接没有左树或没有右树if (start end){return;}//在找基准之前,进行三数取中的优化,尽量去解决划分不均匀的问题.//在left,mid,right三个数中找到中间大的数字做keyint index findMidValueOfIndex(array, start, end);swap(array,start,index);int pivot partitionHoare(array,start,end);quick(array,start,pivot-1);quick(array,pivot1,end);}//3个数中取中位数private static int findMidValueOfIndex(int[] array,int start,int end){int minIndex (startend)/2;if (array[start] array[end]){if (array[minIndex] array[start]){return start;}else if (array[minIndex] array[end]){return end;}else {return minIndex;}}else {if (array[minIndex] array[end]){return end;}else if (array[minIndex] array[start]){return start;}else {return minIndex;}}} 我们除了采取这种优化之外,还可以在快速排序递归到小区间的时候,采用插入排序. 因为插入排序在数据趋于有序并且数据量小的时候,排序的速度非常快. 非递归实现快速排序 public static void quickSort2(int[] array) {StackInteger stack new Stack();int start 0;int end array.length-1;int pivot partition(array,start,end);//1.判断左边是不是有2个元素if(pivot start1) {stack.push(start);stack.push(pivot-1);}//2.判断右边是不是有2个元素if(pivot end-1) {stack.push(pivot1);stack.push(end);}while (!stack.isEmpty()) {end stack.pop();start stack.pop();pivot partition(array,start,end);//3.判断左边是不是有2个元素if(pivot start1) {stack.push(start);stack.push(pivot-1);}//4.判断右边是不是有2个元素if(pivot end-1) {stack.push(pivot1);stack.push(end);}} 归并排序 先分解,后合并. 将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为二路归并. public static void mergeSort1(int[] array) {mergeSortChild(array,0,array.length-1);}private static void mergeSortChild(int[] array,int left,int right) {if(left right) {return;}int mid (leftright) / 2;mergeSortChild(array,left,mid);mergeSortChild(array,mid1,right);//合并merge(array,left,mid,right);}private static void merge(int[] array,int left,int mid,int right) {int s1 left;int e1 mid;int s2 mid1;int e2 right;int[] tmpArr new int[right-left1];int k 0;//表示tmpArr 的下标while (s1 e1 s2 e2) {if(array[s1] array[s2]) {tmpArr[k] array[s1];}else{tmpArr[k] array[s2];}}while (s1 e1) {tmpArr[k] array[s1];}while (s2 e2) {tmpArr[k] array[s2];}//tmpArr当中 的数据 是right left 之间有序的数据for (int i 0; i k; i) {array[ileft] tmpArr[i];}} 时间复杂度:O(n*logn). 空间复杂度:O(n) 稳定性:稳定 非递归的归并排序 public static void mergeSort(int[] array) {int gap 1;while (gap array.length) {for (int i 0; i array.length; i gap*2) {int left i;int mid left gap -1;int right midgap;if(mid array.length) {mid array.length-1;}if(right array.length) {right array.length-1;}merge(array,left,mid,right);}gap * 2;}}
http://www.hkea.cn/news/14537122/

相关文章:

  • 怎样破解网站后台密码东莞电子商务网站建设
  • 做网站好域名备案 网站备案
  • 简单的企业网站cms成都网站建设公司高新
  • 这么做简单的网站东南亚跨境电商有哪些平台
  • 网站建设在电子商务中的作用网站定制开发流程
  • 苏州网站建设智能 乐云践新网站营销方法
  • 北京金融网站建设企业建站的费用
  • 超市网站模版建设外贸网站哪家好
  • 如何制作自己的网站免费江安县建设招标网站
  • 网站建设 赛门仕博网站百度权重没有数据
  • 无棣网站建设关于单位建设网站的申请
  • 电商网站开发文献汇总宁波企业网站排名方法
  • 美工做网站尺寸多少钱电子商务网站开发与管理
  • 建设网站外包公司淘宝可做的团购网站
  • .中国域名的网站广告设计与制作app
  • 怎样才能建立网站中关村手机排行榜
  • 自己做项目的网站wordpress登陆页背景
  • 学校网站asp优秀的软文广告欣赏
  • 哪个行业对网站建设需求大哪家企业网站建设好
  • 做ic哪些网站好做山西 网站建设
  • html做的网页怎么变成网站学网站设计培训电话
  • 佛山网站建设公司怎么选长沙装修网站排名
  • 池州网站制作大连做网站谁家好
  • 网站美化教程下载wordpress自定义字段类型
  • 网络公司网站设计多少钱青海wap网站建设公司
  • 上海外贸soho网站建设网站开发工作量
  • 湖北平台网站建设制作网站制作需要网站制作
  • 深圳企业社保网站官网贵州省中海工程建设有限公司网站
  • 外销网站建设国内最新消息
  • 腾讯云做网站步骤网站建设有利于