對換和迴圈移位是一回事

2021-06-05 06:25:28 字數 1785 閱讀 3435

----本文只是個人一點拙見,高手請忽略此文。

今天在看《程式設計之美》,裡面有道很經典的題目--陣列迴圈移位。之所以說它經典,是因為它多次出現各大it公司的筆試、面試題上,而且這道題還曾經入選計算機考研的演算法題。相信很多人都知道解法了,而且不只一種解法。書上也給出了三種解法,分別用了移位、考慮周全的移位和對換。看了書中的解法,除了了解題目本身的解法外,突然恍然大悟,原來對換和迴圈移位就是一回事啊!為什麼這麼說呢?讓我們來看個最經典的交換演算法,以交換一位為例:

讓我們來看個最經典的交換演算法,以交換一位為例:

static void swap(int a, int b)
這演算法相信學過程式設計的人都知道,簡單得不能再簡單了。它使用了乙個變數做為臨時變數,臨時儲存資料。如下圖所示,箭頭表示交換過程。

可是我們可以換一種角度來看,它的意思的是說,在乙個有兩個數的陣列中,a向右迴圈移位,a代替了b原來所在的位置,b則移到了a 的位置,從而變成了。是吧,也就是說兩個數的交換和兩個數的迴圈移位一位等效。如此推理,交換乙個長度為n的陣列,就是對乙個長度為n的陣列迴圈移位n/2位。

知道了這個概念有什麼用呢,這有助於理解插入演算法。所謂插入演算法的核心函式是在第i位插入乙個數,並且讓這個陣列從這個位置開始右移。這個函式我們可以理解為陣列在末位插入了這個數,然後這個陣列從第i位開始到陣列的末端進行迴圈右移一位,這樣新插入的數因為右移就會移動第i個位置去。**如下

/**

* 右移

* * @param arrs

* 陣列

* @param i

* 起始位置

* @param j

* 結束位置

*/static void shift(int arrs, int i, int j)

/*** 插入

* @param arrs 陣列

* @param i 插入的位置

* @param k 新插入的數值

*/static void insert(int arrs,int i,int k)

很多人可能對shift方法記不住,記不清k從多少開始,或者到底是arrs[k]賦值給arrs[k+1]還是arrs[k+1]賦值給arrs[k]。既然交換和迴圈移位是一回事,那麼我們可以以交換來理解。也就是說,他們的過程可以這樣理解:陣列的末位a[j]和a[j-1]交換,然後a[j-1]和a[j-2]交換,...,直到a[i+1]和a[i]交換。這樣就把a[j]移到了a[i]原來的位置上。

如果把每一步寫出來就是這樣:

int temp = arrs[j];

arrs[j] = arrs[j-1];

arrs[j-1] = temp;

temp = arrs[j-1];

arrs[j-1] = arrs[j-2];

arrs[j-2] = temp;

...temp = arrs[i+1];

arrs[i+1] = arrs[i];

arrs[i] = temp;

約去無效的**:

int temp = arrs[j];

arrs[j] = arrs[j-1];

arrs[j-1] = arrs[j-2];

...arrs[i+1] = arrs[i];

arrs[i] = temp;

用迴圈寫的話就是上面的方法。因此,如果shift方法記不住的話,可以多想想交換,**就能起想來了。

記憶體洩漏是怎麼一回事

一般我們常說的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,大小任意的 記憶體塊的大小可以在程式執行期決定 使用完後必須顯示釋放的記憶體。應用程式一般使用malloc,realloc,new等函式從堆中分配到一塊記憶體,使用完後,程式必須負責相應的呼叫free或delete釋放該記憶體...

C 模版是怎麼一回事

學習c 一直對這塊不是很了解,今天有時間搞搞,模版的概念是在c 語言的高版本才引進的,模版是引數化的型別,在有模版之前 c 語言的程式設計師熱衷於設計類屬一類 其目標是為了實現程式 的可重用性,通過屬性程式設計,使得同一結構 的不同例項公用同樣的 這樣的類屬性資料結構包括 桟 佇列,陣列 矩陣 鍊錶...

簡單聊聊佇列是怎麼一回事

理論 作為資料結構的一種,佇列的應用範圍其實也是非常廣泛的。所謂佇列其實設定的訪問模式就取自於現實生活中的排隊模型,排隊也就是所謂的先來者先出。資料結構中的佇列同樣也是這種用法,你可以利用陣列或者鍊錶的任意乙個形式去實現乙個佇列,但是要注意對於乙個佇列的操作,應當只有入隊和出隊操作。利用 實現時,我...