两段已序子数组 就地排序

来源:互联网 发布:淘宝企业店铺服务费 编辑:程序博客网 时间: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;}}}