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

怎样保存网站资料做证据十大最免费软件排行榜

怎样保存网站资料做证据,十大最免费软件排行榜,软件开发入门教程自学,网站即时客服系统文章目录 912. 排序数组递归版归并排序非递归版归并排序 912. 排序数组 912. 排序数组 ​ 给你一个整数数组 nums,请你将该数组升序排列。 示例 1: 输入:nums [5,2,3,1] 输出:[1,2,3,5]示例 2: 输入:…

文章目录

  • 912. 排序数组
  • 递归版归并排序
  • 非递归版归并排序

在这里插入图片描述

912. 排序数组

912. 排序数组

​ 给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

递归版归并排序

​ 其实我们之前就已经接触过归并排序了,就是很经典的分治思想,如下图所示:

在这里插入图片描述

​ 它和快速排序的思想一样,都是基于分治思想的,但不同的是,快速排序是先对当前数组区间进行处理,然后再递归左右区间继续处理,所以 快速排序相当于是一个前序遍历

​ 而归并排序则是先递归左右区间进行处理,等左右区间都处理完之后才返回给当前数组区间进行合并处理,所以 归并排序相当于是后序遍历

​ 并且归并排序是一种二分的思路,不是去找随机位置作为基准值,方便处理!

在这里插入图片描述

class Solution {
public:void merge_sort(vector<int>& nums, int left, int right, vector<int>& tmp){// 递归终止条件if(left >= right)return;// 先进行分治,递归到左右区间去处理,这里采用二分法int mid = (left + right) >> 1;merge_sort(nums, left, mid, tmp);merge_sort(nums, mid + 1, right, tmp);// 合并两个有序数组到tmp中int i = left;                    // 用来标记tmp的下标int cur1 = left, cur2 = mid + 1; // 分别指向两个有序数组的起始位置while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2])tmp[i++] = nums[cur1++];elsetmp[i++] = nums[cur2++];}while(cur1 <= mid)tmp[i++] = nums[cur1++];while(cur2 <= right)tmp[i++] = nums[cur2++];// 将tmp中元素写回nums中while(left <= right){nums[left] = tmp[left];left++;}}vector<int> sortArray(vector<int>& nums) {vector<int> tmp(nums.size()); // 开辟一个辅助数组merge_sort(nums, 0, nums.size() - 1, tmp);return nums;}
};

非递归版归并排序

思路:与递归不同的是,迭代是不需要分解的,只需要控制好每次归并的区间,让它们从一一归并、二二归并、四四归并……即可,直到最后归并成一个完整的数组。

注意要点: 归并时候可能存在的三种情况:(1、2点可合成为一点处理)

  1. 最后一个小组归并时,第一个小区间不够 gap 个,那么就不需要归并
  2. 最后一个小组归并时,第二个小区间不存在, 那么就不需要归并
  3. 最后一个小组归并时,第二个小区间存在,第二个区间不够 gap 个,那么只需要归并到第二个小区间的末尾即可
class Solution {
public:vector<int> sortArray(vector<int>& nums) {// 开辟一个辅助数组int n = nums.size();vector<int> tmp(n); int gap = 1;while(gap < n){for(int i = 0; i < n; i += gap*2){// 先用变量定义出两个区间的边界int left1 = i, right1 = i + gap - 1;int left2 = i + gap, right2 = i + 2*gap - 1;// 归并最后一小组时,如果不存在第二个小区间,则无需归并if(left2 >= n)break;// 归并最后一小组时,如果第二个小区间不够gap个,则要调整一个边界if(right2 >= n)right2 = n - 1;// 进行合并处理merge(nums, left1, right1, left2, right2, tmp);}// 别忘了让gap翻倍gap *= 2;}return nums;}// 合并有序数组函数void merge(vector<int>& nums, int left1, int right1, int left2, int right2, vector<int>& tmp){int i = left1; // 用来标记tmp的下标int j = left1; // 先记下left1的位置,因为后面要用到while(left1 <= right1 && left2 <= right2){if(nums[left1] <= nums[left2])tmp[i++] = nums[left1++];elsetmp[i++] = nums[left2++];}while(left1 <= right1)tmp[i++] = nums[left1++];while(left2 <= right2)tmp[i++] = nums[left2++];// 将tmp中元素写回nums中while(j <= right2){nums[j] = tmp[j];j++;}}
};

在这里插入图片描述

http://www.dtcms.com/wzjs/59766.html

相关文章:

  • 武汉个人做网站怎么找关键词
  • 怎么做网站的排名优化互联网营销师证书是国家认可的吗
  • 陕西免费做网站公司怎么做推广比较成功
  • 橙子建站是真实的吗百度认证有什么用
  • 营销型网站建设定制网站建设花生壳免费域名注册
  • 个人能备案多少个网站免费软文网站
  • 亦庄建设局网站网站推广做什么
  • 旅游网站开发功能需求网站排名怎么做上去
  • 平面设计培训学校排名seo外链发布软件
  • 哈尔滨免费做网站在线观看的seo综合查询
  • 我的世界怎么做充值点卷网站环球军事网
  • 网站到期时间目前最新的营销方式有哪些
  • 遂宁网站制作如何制作自己的网址
  • 网站没有备案信息该怎么做电子商务说白了就是干什么的
  • 2017织梦网站怎么做seo色盲眼镜
  • 高价做单网站查询网站
  • 以鹦鹉做头像的网站seo超级外链发布
  • 网站开发建设兼职营销网站建设创意
  • 安徽省建设干校学校网站河南seo和网络推广
  • 太原市建设厅网站宁波seo网络推广优化价格
  • wordpress 不显示边栏seo广州工作好吗
  • 建设部建筑招投标网站百度seo多少钱一个月
  • 网站开发毕设盐城seo培训
  • 手机好在百度做网站吗衡阳百度seo
  • 顺德互动交流网站百度电商广告代运营
  • 西宁做网站的公司搭建自己的网站
  • 建设银行网站 查余额查询郑州网站推广培训
  • 五莲县城乡建设局网站首页如何引流客源最快的方法
  • 做一个购物网站需要什么技术网站排名分析
  • 做网站流程顶尖文案网站