问题描述:
设a[n-1]是有n个元素的数组,k(0≤k≤n-1)是一个非负整数。试设计一个算法将子数组a[0:k-1]与a[k:n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅空间。
样例1:
输入:
5
1 2 3 4 5
2
输出:
3 4 5 1 2
样例2:
输入:
5
1 2 3 4 5
3
输出:
4 5 1 2 3
#include <stdio.h>
#define N 100
//k<=n/2,从前往后交换数组元素
int Swap_One(int *array, int start, int k, int n)
{
int t;
//两个子数组的元素一样多
if(2*k==(n+1))
{
while(k<=n)
{
t = array[k];
array[k] = array[start];
array[start] = t;
k++;
start++;
}
}
else
{
while(start<n)
{
t = array[k];
array[k] = array[start];
array[start] = t;
k++;
start++;
if(k>n)
k=n;
}
}
}
//k>n/2,从后往前交换数组元素
int Swap_Two(int *array, int start, int k, int n)
{
int t;
while(n>start)
{
t = array[k];
array[k] = array[n];
array[n] = t;
k--;
n--;
if(k<start)
k=start;
}
}
//n 数组大小
// array 数组名
// k 分段参数
int main()
{
int n;
int array[N];
int k;
scanf("%d", &n);
for(int i=0;i<n;i++)
scanf("%d", &array[i]);
scanf("%d", &k);
if(k<=n/2){
//传参数k
Swap_One(array, 0, k, n-1);
} else{
//传参数k-1 由于相对分段位置不同
Swap_Two(array, 0, k-1, n-1);
}
for(int i=0;i<n;i++)
printf("%3d", array[i]);
return 0;
}
谢谢参考!