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

希望小学学校网站建设方案网络商城推广

希望小学学校网站建设方案,网络商城推广,大设计师论坛网页设计,如何自己做网页求逆序对问题用归并排序的时间复杂度比暴力算法更低。假设有一个数组{8#xff0c;1#xff0c;2#xff0c;5#xff0c;7#xff0c;4#xff0c;3#xff0c;6}首先归并排序第一次对数组进行分割 8 1 2 5 7 4 3 6二次分割 8 1 25 74 3…求逆序对问题用归并排序的时间复杂度比暴力算法更低。假设有一个数组{81257436}首先归并排序第一次对数组进行分割      8 1 2 5      7 4 3 6二次分割      8 1      25      74      36三次分割      8      1      2      5      7      4      3      6第一次合并     18     25     74     36      reorder[1]2, order[1]2//用reorder[i]来记录第i次合并中存在的逆序对数,order[i]来记录第i次合并中存在的顺序对数。第二次合并     1258     3467     reorder[2]5, order[2]3第三次合并     12345678          reorder[3]6, order[3]10那么数组{81257436}中存在的逆序对就等于reorder[1]reorder[2]reorder[3]13将数组{81257436}每2^2个为一组进行翻转{52186347}首先归并排序第一次对数组进行分割      5 2 1 8      6 3 4 7二次分割      5 2      18      63      47三次分割      5      2      1      8      6     3      4      7第一次合并     25     18    36     47      reorder[1]2, order[1]2第二次合并     1258     3467     reorder[2]3, order[2]5第三次合并     12345678          reorder[3]6, order[3]10那么数组{52186347}中存在的逆序对就等于reorder[1]reorder[2]reorder[3]11由此我们可以观察到对数组每2^2个进行翻转时reorder[1]和order[1]进行了互换,reorder[2]和order[2]亦是如此。所以对数组每2^i个进行翻转时我们可以把1~i的reorder和order数组元素互换即可继续通过计算reorder数组的累加和来求得数组的逆序对数。import java.util.ArrayList;import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc new Scanner(System.in);int n sc.nextInt();int N 1 n;int[] a new int[N];int[] b new int[N];//用来存储数组的逆序,对逆序的数组进行一次归并排序可以直接得到order数组int[] order new int[n 1];//为了便于计算所以设置order下标是1~n因此数组大小为n1int[] reorder new int[n 1];for (int i 0; i N; i){a[i] sc.nextInt();b[N - i - 1] a[i];}MergeSort(a, 0, N - 1, reorder, n);//对整个数组进行归并排序n表示对reorder[1]~reorder[n]进行初始化MergeSort(b, 0, N - 1, order, n);//对整个逆序数组进行归并排序完成对order[1]~order[n]的初始化int m sc.nextInt();while(m-- 0){int count 0;int q sc.nextInt();for (int i 1; i q; i) //像之前讲的将1~q的reorder[i]和order[i]进行互换{int temp reorder[i];reorder[i] order[i];order[i] temp;}for (int i 1; i n; i){count reorder[i];//累加reorder数组求得对数组中每2^q个元素进行翻转后的逆序对数}System.out.println(count);}}public static void MergeSort(int[] a , int left, int right, int[] reorder, int index){if(left right){int mid (right left) / 2;MergeSort(a, left, mid, reorder,index - 1);MergeSort(a, mid 1, right, reorder,index -1);if(a[mid] a[mid1])//如果a[mid]a[mid1]则原数组有序不需要合并Merge(a, left, right,reorder, index);}}public static void Merge(int[] a, int left, int right,int[] reorder, int index)//index表示对reorder[index]进行初始化{int mid (right left) / 2;int Length1 mid - left 1;int Length2 right - mid;int[] l new int[Length1];//存储a[left]~a[mid]int[] r new int[Length2];//存储a[mid1]~a[right]System.arraycopy(a, left, l, 0, Length1);//对l进行初始化System.arraycopy(a, mid 1, r, 0, Length2);//对r进行初始化int i 0;int j 0;int c 0;int k left;while(i Length1 j Length2){if(l[i] r[j]){a[k] l[i];i;}else{a[k] r[j];j;c Length1 - i;//当l[i]r[j]时因为l是递增序列所以l[i]~l[Length1-1]均r[j]所以有Length1-i个元素大于r[j]}k;}System.arraycopy(l, i, a, k, Length1 - i);//前面归并排序MergeSort中调用Merge合并的条件是a[mid]a[mid1],因为当a[mid]a[mid1]时说明原数组有序无需合并。l[Length1-1]r[Length2-1],即l数组的最大值大于r数组的最大值所以当r中的数全部进入a数组后l数组中仍有剩余。reorder[index] c;}}
http://wiki.neutronadmin.com/news/200919/

相关文章:

  • 网站建设 案例展示嘉兴seo网站优化
  • 网站简介 title网站建设系统源码
  • 可信网站值得做吗网络推广策划案格式模板和范文
  • 怎么自己创建网站免费aliyun怎么建网站
  • 商城网站开发业务求职网站网页设计
  • 企业网站一定要花钱吗做搜狗手机网站点击软
  • 网站成品下载wordpress打分
  • 恢复被百度k网站 关键词收录广州移动 网站建设
  • 西宁网站系统建设东莞软件设计
  • 江苏网站建设费用赣州网站开发公司
  • 企业网站系统功能设计说明wordpress第三方支付插件
  • 天津企业网站制作中小型网站建设策划
  • wordpress透明沈阳seo公司
  • 网站建设格式百度地图放到网站上
  • 网站框架是谁做知识产权教育网站建设方案
  • 制作网站公司哪里好东莞通充值
  • 东莞建站模板公司做网站合同范本
  • 网站设计分析案例网站备案要拍照大家怎么做的啊
  • 网站遭受攻击professional wordpress
  • 网站icp备案查询截图机加工如何用网站开发客户
  • 贵阳网站设计方案wordpress怎么关注站点
  • 烟台做网站打电话话术做自媒体哪个平台最好
  • 建设银行培训网站公司主页填什么
  • 河南网站建设价格与方案工商营业执照查询官网
  • 山东省水利建设市场信用信息平台网站wordpress手机适配模板中文
  • com域名注册1元关键词优化精灵
  • 网站用户需求报告外包公司是做什么的
  • wordpress 工具栏图标做搜狗手机网站优化软
  • 东莞网站网站建设养老院网站建设方案
  • 呼和浩特网站seo优化方案重庆建设工程造价信息网官网查询