两段已序子数组 就地排序
来源:互联网 发布:淘宝企业店铺服务费 编辑:程序博客网 时间:2024/04/30 00:47
问题描述
输入:数组 a,分成两段;第一段长度为 m,已序,第二段长度为 n,已序
要求:将整个数组 a 排列为全部有序,只使用一个临时变量,即空间复杂度为 O(1)
解决思路
设定数组 a[m+n],第一段为 a[i], 0 < i < m-1;第二段为 a[j], m < j < m+n-1。
方法:将第二段的元素依次插入到第一段已序的子数组中,即特殊的插入排序。
何时插入过程结束?
分两种情况:
1、当第二段最后一个元素 a[m+n-1] 插到第一段中( j == m+n-1 )。这意味着第二段的全部元素均已插入。
2、当第二段一个元素 >= 第一段最后一个元素,相当于插入在当前位置,即位置不变( i == j-1 )。这意味着数组已经全部有序,无需对第二段还剩下的元素继续插入。
源码如下:
void sortInPlace (int *a, int m, int n){int i, j, p, temp;i = 0;j = m;while ( j < m + n && i < j ){if ( a[i] > a[j] ){temp = a[j];for ( p = j; p > i; --p )a[p] = a[p-1];a[p] = temp;++i;++j;} else{++i;}}}
- 两段已序子数组 就地排序
- 就地堆排序
- 将数组中的正负数就地归类
- 就地归并排序算法的未做优化实现
- 链表的就地至逆和冒泡排序
- 就地归并排序inplacMergeSort,空间复杂度O(1)
- 实战数据结构(10)_单链表的就地排序
- ※ Leetcode - Array -Remove Duplicates from Sorted Array(就地有序数组去重)
- 线性表的就地逆置(数组实现+链表实现)
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 数组排序
- 浏览器缓存机制
- C#入门经典—第二章
- 三星水波纹锁屏
- OpenStack Availability Zone和Aggregate Hosts理解
- spring 中事务的Readonly的解释
- 两段已序子数组 就地排序
- nginx 配置expires
- 对 HTTP 304 的理解
- 图模型简介(一)
- 从触宝号码助手遇到微信 看APP平台化是大势所趋还是随波逐流
- 学习编写java类的技术文档
- C++实现势能函数
- vbs命令
- 如何学好java---技术总监给新进技术人员的建议