兩個順序表的位置互換 陣列元素序列迴圈左移

2021-09-24 20:43:15 字數 2007 閱讀 6019

完整**(c++)

已知在一維陣列[m+n]中依次存放兩個線性表(a1,a2,…,am)和(b1,b2,…,bn),現要將這兩個順序表位置互換。

本題也可以理解為要將陣列中的元素序列迴圈左移m個位置。

第一種

將兩個線性表各看成乙個整體,用(t=a,a=b,b=t)的方法進行交換,這種方法思路非常簡單好懂,但是執行起來比較麻煩,這裡為了方便程式設計,直接令臨時陣列t的長度為m,演算法空間複雜度為o(m);

第二種

用陣列元素逆置的方法,假設a代表陣列前m個元素,b代表陣列餘下的n個元素,那麼這個問題實際上就是如何把陣列ab換成ba。

對於陣列ab,先將a逆置得到a-1b,再將b逆置得到a-1b-1。最後對整個陣列進行逆置(a-1b-1)-1,即可得到ba。

舉個例子,設函式reverse執行陣列元素逆置的操作,現在有一組陣列[1,2,3,4,5,6,7,8],要迴圈左移3個元素。具體變化過程如下:

reverse(0,2),得到[3,2,1,4,5,6,7,8];

reverse(3,7),得到[3,2,1,8,7,6,5,4];

reverse(0,7),得到[1,2,3,4,5,6,7,8]。

該演算法中三個reverse的時間複雜度分別為o(m/2)、o(n/2)、o(m+n/2),故時間複雜度為o(m+n),空間複雜度為o(1)。

整體代換法

void

exchange

(datatype a

, int m, int n, int arraysize)

//逆置方法

void

reverse

(datatype a

, int left, int right)

逆置為//注意,傳值時,left和right均為陣列的下標,而不是準確的位置

if(left >= right)

return

;//判斷逆置區間

for(int i =

0; i <=

(right - left)/2

; i++)}

void

exchangeab

(datatype a

, int m, int n)

//函式功能:

//實現一維陣列中兩個順序表的位置互換

#include

using namespace std;

typedef int datatype;

//整體代換法

void

exchange

(datatype a

, int m, int n, int arraysize)

//逆置方法

void

reverse

(datatype a

, int left, int right)

逆置為//注意,傳值時,left和right均為陣列的下標,而不是準確的位置

if(left >= right)

return

;//判斷逆置區間

for(int i =

0; i <=

(right - left)/2

; i++)}

void

exchangeab

(datatype a

, int m, int n, int arraysize)

void

print

(datatype a

, int length)

void

main()

;print(ab

,7);

exchange(ab

,3,4

,7);

//exchangeab(ab, 3, 4, 7);

print(ab

,7);

}

交換陣列中兩個元素的位置

簡單的交換陣列中倆個元素的位置,交換後為.同樣交換倆個數字,比如這樣的 public static void swap int a,int b 然後再列印的話,實際上是交換不了的。因為此時的 a,b只是形參,我們知道形參的改變不會影響實參的變化,因此交換不了。那麼為什麼陣列可以交換呢,讓我們來看一下...

js改變陣列的兩個元素的位子,互換 置頂

js陣列的元素上移和下移動 var fielddata var index 9 須知 unshift 方法可向陣列的開頭新增乙個或更多元素,並返回新的長度。shift 方法用於把陣列的第乙個元素從其中刪除,並返回第乙個元素的值。splice 方法可刪除從 index 處開始的零個或多個元素,並且用引...

python將句子中兩個子串位置互換的

想要將文中所有的類似 aa citebb citecc 替換為aa cite bb cite cc 即 與 cite 互換位置 採用非貪婪匹配,邊界條件都用 來匹配即可。import sys import os import re def changefile filename p re.compi...