博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序...
阅读量:5846 次
发布时间:2019-06-18

本文共 1460 字,大约阅读时间需要 4 分钟。

题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。

分析

 

代码实例:

View Code
#include
#include
#include
using namespace std;void MergeSort(int arry[],int len){ int left=0; int mid=len/2; int right=mid; while(left
arry[mid]) { while(arry[right]

 

新的解体思路

设定两个指针left和right,初始状态下分别指向两个排序数组的首元素,

然后比较a[left]和a[right]大小,

  1. 如果a[left]<=a[right],那么数组中元素位置不发生改变,然后left往前进一步。
  2. 如果a[left]>a[right],则表明前半段元素中存在大于后半段的元素,那么我们将后半段这个小的元素移到前半段来。但是在移动之前,我们得为这个元素空留出地方。这就有了元素移动的操作。比如{1,3,5,7,2,4,6,8,10}这样子序列,我们发现后半段的2小于前半段的3,那么我们将2放入临时变量temp中,然后将{3,5,7}往后移动一个位置,然后将空出来的位置放入temp的值。
  3. 这里总体的循环是while(left<right&&right<len)

代码实现

View Code
void mergesort2(int arry[],int len){    int mid=len/2;    int left=0;    int right=mid;    while(left
left;i--) { arry[i]=arry[i-1]; } arry[left]=temp; } PrintArry(arry,len); cout<
<<" "<
<

上面程序的输出结果是

View Code
1 3 5 7 2 4 5 8 101 41 2 3 5 7 4 5 8 101 51 2 3 5 7 4 5 8 102 51 2 3 5 7 4 5 8 103 51 2 3 4 5 7 5 8 103 61 2 3 4 5 7 5 8 104 61 2 3 4 5 7 5 8 105 61 2 3 4 5 5 7 8 105 71 2 3 4 5 5 7 8 106 71 2 3 4 5 5 7 8 107 7

 

 

转载于:https://www.cnblogs.com/xwdreamer/archive/2012/05/08/2490343.html

你可能感兴趣的文章
跟随我在oracle学习php(8)
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
Kotlin的语法糖(一)基础篇
查看>>
亚信安全参加第六届全国等保技术大会 态势感知助力“等保2.0”落地
查看>>
大数据公司Palantir融得7亿美元 曾追踪拉登
查看>>
建立备份策略的重要性
查看>>
发力IoT领域 Marvell注重生态系统发展
查看>>
你应该知道的 RPC 原理
查看>>
Ubuntu安装词典
查看>>
Spring解析
查看>>
python中str和repr区别
查看>>
数据挖掘-同比与环比
查看>>
RedHat6 管理应用服务【11】
查看>>
stm32F10x复习-1
查看>>
[转] vue异步处理错误
查看>>
CSS 3D动画概述菜鸟级解读之一
查看>>
kindeditor.net应用
查看>>
函数preg_replace()与str_replace()
查看>>
HTTP工具CURL的使用简介
查看>>
P2P的远程协助系统技术分析[转]
查看>>