首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

數組循環左移P位:三次逆置法的O(1)空間實現

     編輯:關於C

問題定義

將長度為n的數組R循環左移P位(0<P<n),即{X₀,X₁,...,Xₙ₋₁} → {Xₚ,Xₚ₊₁,...,Xₙ₋₁,X₀,X₁,...,Xₚ₋₁}。

三次逆置算法原理

利用逆序操作的結合性,分三步完成:

  1. 逆置前P個元素:Reverse(R, 0, P-1)
  2. 逆置剩餘元素:Reverse(R, P, n-1)
  3. 整體逆置:Reverse(R, 0, n-1)

完整代碼實現

void Reverse(int R[], int left, int right) {
    int temp;
    for (int i = left, j = right; i < j; i++, j--) {
        temp = R[i];
        R[i] = R[j];
        R[j] = temp;
    }
}

void RotateLeft(int R[], int n, int p) {
    if (p <= 0 || p >= n) {
        printf("ERROR: Invalid shift amount\n");
        return;
    }
    Reverse(R, 0, p-1);
    Reverse(R, p, n-1);
    Reverse(R, 0, n-1);
}

算法優勢分析

指標三次逆置法輔助數組法逐位移動法
時間複雜度O(n)O(n)O(n×p)
空間複雜度O(1)O(n)O(1)
代碼簡潔度高中低

實戰注意事項

  • 參數校驗:確保0 < p < n
  • 邊界處理:p=0或p=n時數組不變
  • 類型泛化:用void*+元素大小可實現泛型版本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved