一维数组A[m+n],前m项和后n项分别为线性表(a1,a2,...,am)和(b1,b2,...,bn),现要求将其交换位置,变为(b1,b2,...,bn,a1,a2,...,am)。
本人代码片段如下:
void ExchangeAB(SeqList &L, int m, int n){
if (m < 1 || n < 1) {
return;
}
int p = m, q = n, t; //p为每次交换的左边数列元素数,q为每次交换的右边数列元素数;
int left = 0, right = m + n - 1; //每次交换的左边界和右边界
while (q > 0 && p > 0 && left < right) { //当数列未交换完毕
if (p > q) { //若左边比右边长
for (int i = left; i < left + q; i++) {
t = L.data[i];
L.data[i] = L.data[i + p];
L.data[i + p] = t;
}
left += q; //修改左边界
p -= q; //修改左边数列长度
} else { //若左边比右边短
for (int i = left; i < left + p; i++) {
t = L.data[i];
L.data[i] = L.data[i + q];
L.data[i + q] = t;
}
right -= p; //修改右边界
q -= p; //修改右边数列长度
}
}
}
该算法时间复杂度仅有O(n),利用分治法思想完成,仅需遍历一遍数列即可。
完整可运行代码如下:
#include <iostream>
#define MaxSize 50
using namespace std;
typedef struct {
int data[MaxSize];
int length;
}SeqList;
void OutputList(SeqList &L){
for (int i = 0; i < L.length; i++) {
cout << L.data[i];
}
}
void CreateList(SeqList &L){
int l;
cout << "Please enter the length:";
cin >> l;
L.length = l;
for (int i = 0;i<L.length;i++) {
cout << "Please enter the num" << i << ":";
cin >> L.data[i];
}
}
void ExchangeAB(SeqList &L, int m, int n){
if (m < 1 || n < 1) {
return;
}
int p = m, q = n, t, left = 0, right = m + n - 1;
while (q > 0 && p > 0 && left < right) {
if (p > q) {
for (int i = left; i < left + q; i++) {
t = L.data[i];
L.data[i] = L.data[i + p];
L.data[i + p] = t;
}
left += q;
p -= q;
} else {
for (int i = left; i < left + p; i++) {
t = L.data[i];
L.data[i] = L.data[i + q];
L.data[i + q] = t;
}
right -= p;
q -= p;
}
}
}
int main(int argc, char *argv[]) {
SeqList L;
CreateList(L);
ExchangeAB(L, 3, 9); //自已设定m与n的值
OutputList(L);
}
网友评论