陣列倒序排列,陣列倒置,C語言陣列倒序演算法詳解

2020-07-16 10:04:23
本節介紹將陣列倒置的實現方法。所謂倒置就是將陣列元素中的資料倒過來。
# include <stdio.h>
int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    int b[5];  //用來存放倒置後的資料
    int i, j;
    for (i=0, j=4; i<5, j>=0; ++i, --j)
    {
        b[i] = a[j];
        printf("%dn", b[i]);
    }
    return 0;
}
輸出結果是:
5
4
3
2
1

此程式中,for 迴圈括號中的寫法是正確的。前面講過,for 迴圈的格式為:

for (表示式1;表示式2;表示式3)

這只是一般的形式。以表示式 1 為例,它是一個“整體”,它可以是一個表示式,也可以是多個表示式,如果是多個表示式就用逗號隔開,如程式中那樣。但是如果表示式間用分號隔開就不能看成一個“整體”,即只能看成一個表示式了,如上面的“表示式 1;表示式 2;表示式 3”。

但是上面這個程式還不能稱得上完美。程式中,完成相同功能執行的步數越少,演算法就越好,效率也就越高。上面這個演算法是完全的“複製”,陣列有幾個元素就執行多少次。其實有更好的演算法,只需要上面演算法執行步數的一半就能完成任務,即互換思想。

要完成倒置的功能,只需要第一個元素和最後一個元素交換、第二個元素和倒數第二個元素交換、第三個元素和倒數第三個元素交換……不管陣列元素的個數是奇數還是偶數,這個演算法都是成立的。如果是偶數那麼每個元素都有機會交換;如果是奇數,那麼最中間的那個元素就不交換。下面將陣列加長,再將這種演算法的程式給大家寫一下:
# include <stdio.h>
int main(void)
{
    int a[23] = {1,5,66,8,55,9,1,32,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215};
    int i = 0;  //迴圈變數1, i的值為陣列第一個元素的下標
    int j = 22;  //迴圈變數2, j的值為陣列最後一個元素的下標
    int buf;  //互換時的中間儲存變數
    for (; i<j; ++i, --j)  /*因為i和j已經初始化過了, 所以表示式1可以省略, 但表示式1後面的分號不能省。*/
    {
        buf = a[i];
        a[i] = a[j];
        a[j] = buf;
    }
    for (i=0; i<23; ++i)
    {
        printf("%dx20", a[i]);  //x20表示空格
    }
    printf("n");
    return 0;
}
輸出結果是:
215 7 9 8 1 15 1564 156 64 15 5 8 4 65 5 32 1 9 55 8 66 5 1