Array Insertion at Beginning in DSA C - Time & Space Complexity
We want to understand how long it takes to add a new item at the start of an array.
Specifically, how the time grows as the array gets bigger.
Analyze the time complexity of the following code snippet.
void insertAtBeginning(int arr[], int *size, int capacity, int value) {
if (*size >= capacity) return; // no space
for (int i = *size; i > 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = value;
(*size)++;
}
This code inserts a new value at the start of the array by shifting all existing elements one step to the right.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that shifts elements to the right.
- How many times: It runs once for each existing element in the array (size times).
As the array size grows, the number of shifts grows the same way.
| Input Size (n) | Approx. Operations (shifts) |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The work grows directly with the number of elements; doubling the array size doubles the work.
Time Complexity: O(n)
This means the time to insert at the beginning grows linearly with the array size.
[X] Wrong: "Inserting at the beginning is always fast because it's just one step."
[OK] Correct: Because all existing elements must move one step to make space, so the time depends on how many elements there are.
Understanding this helps you explain why arrays are not always the best choice for adding items at the start, showing your grasp of data structure trade-offs.
"What if we changed the array to a linked list? How would the time complexity of insertion at the beginning change?"
Practice
Solution
Step 1: Understand array memory layout
Arrays store elements in continuous memory. To insert at the start, existing elements must move to free space.Step 2: Shift elements to the right
Each element moves one position right to open index 0 for the new element.Final Answer:
All existing elements shift one position to the right to make space. -> Option BQuick Check:
Insert at start = shift right [OK]
- Assuming new element overwrites first element
- Thinking array size grows automatically
- Removing last element without reason
Solution
Step 1: Identify correct loop direction for shifting
To avoid overwriting, shift elements from end to start (i = n down to 1).Step 2: Assign new element at index 0
After shifting, place new_element at arr[0].Final Answer:
for(int i = n; i > 0; i--) arr[i] = arr[i-1]; arr[0] = new_element; -> Option CQuick Check:
Shift right from end, then insert [OK]
- Shifting from start to end causing overwrite
- Assigning new element before shifting
- Incorrect loop boundaries
int arr[5] = {10, 20, 30, 40, 0};
int n = 4;
int new_element = 5;
for(int i = n; i > 0; i--) {
arr[i] = arr[i-1];
}
arr[0] = new_element;
Solution
Step 1: Shift elements right from index 4 to 1
arr[4]=arr[3]=40, arr[3]=arr[2]=30, arr[2]=arr[1]=20, arr[1]=arr[0]=10Step 2: Insert new_element at arr[0]
arr[0] = 5Final Answer:
[5, 10, 20, 30, 40] -> Option DQuick Check:
Shift right + insert 5 at start = [5,10,20,30,40] [OK]
- Not shifting last element correctly
- Overwriting elements during shift
- Forgetting to insert new element at index 0
int arr[5] = {1, 2, 3, 4, 0};
int n = 4;
int new_element = 0;
for(int i = 0; i < n; i++) {
arr[i+1] = arr[i];
}
arr[0] = new_element;
Solution
Step 1: Analyze loop direction and assignments
Loop shifts elements from start to end, causing arr[i+1] to overwrite arr[i+1] before it is copied.Step 2: Correct approach is to shift from end to start
Shifting from end to start prevents overwriting original values during shift.Final Answer:
Loop direction causes overwriting of elements during shift. -> Option AQuick Check:
Shift must go backward to avoid overwrite [OK]
- Shifting forward overwrites data
- Ignoring array size limits
- Incorrect loop boundaries
int arr[7] = {2, 4, 6, 8, 10, 0, 0}; with n = 5 elements, write the steps to insert 1 at the beginning and then 0 at the beginning again. What will be the final array content?Solution
Step 1: Insert 1 at beginning
Shift elements right: arr[5]=arr[4]=10, arr[4]=arr[3]=8, arr[3]=arr[2]=6, arr[2]=arr[1]=4, arr[1]=arr[0]=2; then arr[0]=1. Array: [1, 2, 4, 6, 8, 10]Step 2: Insert 0 at beginning
Shift elements right again: arr[6]=arr[5]=10, arr[5]=arr[4]=8, arr[4]=arr[3]=6, arr[3]=arr[2]=4, arr[2]=arr[1]=2, arr[1]=arr[0]=1; then arr[0]=0. Array: [0, 1, 2, 4, 6, 8, 10]Final Answer:
[0, 1, 2, 4, 6, 8, 10] -> Option AQuick Check:
Two shifts + inserts = [0,1,2,4,6,8,10] [OK]
- Not updating array size after insertions
- Overwriting elements during second insertion
- Assuming array can hold more than 6 elements
Ready to prove it?
Pass the test and this pattern moves unknown
