beginner45 minLesson 6 of 8

Algorithm Quality Principles

Learn the key principles that make algorithms good: correctness, efficiency, readability, and maintainability.

Algorithm Quality Principles

Not all algorithms are created equal. Two algorithms can solve the same problem but differ dramatically in how well they do it. Understanding quality principles helps you design algorithms that are not just correct, but also efficient, readable, and maintainable.

The Four Pillars of Algorithm Quality

100%
PillarQuestionWhy It Matters
CorrectnessDoes it produce the right answer for all valid inputs?An incorrect algorithm is useless, no matter how fast
EfficiencyDoes it use time and resources wisely?Inefficient algorithms become unusable with large inputs
ReadabilityCan other people understand it?Unreadable algorithms are hard to verify and trust
MaintainabilityCan it be modified when requirements change?Rigid algorithms become obsolete quickly

Correctness: Getting the Right Answer

Correctness means the algorithm produces the correct output for every valid input. This is the most fundamental quality -- without correctness, nothing else matters.

How to Verify Correctness

  1. Trace with examples: Run the algorithm by hand with known inputs and expected outputs
  2. Test edge cases: Try unusual inputs (empty lists, single items, maximum values)
  3. Reason about it: Prove to yourself that the algorithm must always work
  4. Compare with alternatives: If two algorithms give different answers, at least one is wrong

Example: Finding the Maximum

Correct Version:

ALGORITHM: Find Maximum (Correct) INPUT: A non-empty list of numbers OUTPUT: The largest number STEP 1: SET max TO the first element of the list STEP 2: FOR each remaining element in the list DO IF element is greater than max THEN SET max TO element END IF END FOR STEP 3: RETURN max END ALGORITHM

Incorrect Version:

ALGORITHM: Find Maximum (Incorrect) INPUT: A list of numbers OUTPUT: The largest number STEP 1: SET max TO 0 STEP 2: FOR each element in the list DO IF element is greater than max THEN SET max TO element END IF END FOR STEP 3: RETURN max END ALGORITHM
⚠️Warning

The incorrect version fails when all numbers are negative! If the list is [-5, -3, -8], it would return 0 instead of -3. The correct version starts with the first element, ensuring the answer is always from the list.

Testing with Edge Cases

Test CaseInputExpected OutputCorrect VersionIncorrect Version
Normal[3, 1, 4, 1, 5]555
All negative[-5, -3, -8]-3-30 (WRONG)
Single element[42]424242
All same[7, 7, 7]777
Empty list[]ErrorError0 (WRONG)

Efficiency: Using Resources Wisely

Efficiency measures how well an algorithm uses resources, primarily time (how many steps) and space (how much memory).

Time Efficiency: Counting Steps

Consider two algorithms for finding a name in a phone book:

Algorithm A: Linear Search

ALGORITHM: Linear Search INPUT: A list of names, a target name OUTPUT: Position of target or "not found" STEP 1: FOR each name in the list DO IF name equals target THEN RETURN position END IF END FOR STEP 2: RETURN "not found" END ALGORITHM

Algorithm B: Binary Search (requires sorted list)

ALGORITHM: Binary Search INPUT: A sorted list of names, a target name OUTPUT: Position of target or "not found" STEP 1: SET low TO 0 STEP 2: SET high TO length of list - 1 STEP 3: WHILE low is less than or equal to high DO SET middle TO (low + high) divided by 2 IF list[middle] equals target THEN RETURN middle ELSE IF list[middle] is less than target THEN SET low TO middle + 1 ELSE SET high TO middle - 1 END IF END WHILE STEP 4: RETURN "not found" END ALGORITHM

Comparing Efficiency

List SizeLinear Search (worst case)Binary Search (worst case)
10 items10 checks4 checks
100 items100 checks7 checks
1,000 items1,000 checks10 checks
1,000,000 items1,000,000 checks20 checks
100%
💡Tip

Binary search is dramatically faster for large lists because it eliminates half of the remaining options with each step. This is the power of efficient algorithm design.

Space Efficiency: Memory Usage

Some algorithms need extra memory to work:

ALGORITHM: Reverse List (Uses Extra Space) INPUT: A list of items OUTPUT: A new list with items in reverse order STEP 1: CREATE an empty list called reversed STEP 2: FOR each item in the original list DO INSERT item at the beginning of reversed END FOR STEP 3: RETURN reversed END ALGORITHM
ALGORITHM: Reverse List (In Place) INPUT: A list of items (modified directly) OUTPUT: The same list, reversed STEP 1: SET left TO 0 STEP 2: SET right TO length of list - 1 STEP 3: WHILE left is less than right DO SWAP the items at positions left and right SET left TO left + 1 SET right TO right - 1 END WHILE STEP 4: RETURN the list END ALGORITHM
ApproachExtra Memory NeededModifies Original?
Extra spaceYes (a full copy)No
In placeNo (just two variables)Yes

Readability: Making Algorithms Understandable

Readability measures how easily a human can understand an algorithm. A readable algorithm is easier to verify, debug, and teach to others.

Principles of Readable Algorithms

PrincipleBad ExampleGood Example
Descriptive namesSET x TO 0SET total_score TO 0
Clear structureNo indentation, run-on stepsProper indentation, logical grouping
CommentsNo explanation of whyBrief comments for complex logic
Simple stepsSET result TO (a*b)+(c/d)-e*fBreak into smaller, named steps
Consistent styleMixed conventionsUniform throughout

Example: Readable vs. Unreadable

Unreadable:

ALGORITHM: Calc STEP 1: SET a TO 0 STEP 2: SET b TO 1 STEP 3: WHILE b < 100 DO STEP 4: SET c TO a STEP 5: SET a TO b STEP 6: SET b TO c + b STEP 7: PRINT a STEP 8: END WHILE

Readable:

ALGORITHM: Fibonacci Sequence INPUT: None OUTPUT: Fibonacci numbers less than 100 STEP 1: SET previous TO 0 STEP 2: SET current TO 1 STEP 3: WHILE current is less than 100 DO PRINT current SET next_value TO previous + current SET previous TO current SET current TO next_value END WHILE END ALGORITHM
ℹ️Note

Both algorithms produce the same output, but the readable version tells you what it does (Fibonacci sequence), uses meaningful variable names, and has clear structure.

Maintainability: Adapting to Change

Maintainability measures how easily an algorithm can be modified when requirements change. A maintainable algorithm is modular, well-organized, and flexible.

Designing for Maintainability

PracticeDescriptionBenefit
ModularityBreak into smaller sub-algorithmsEasier to test and modify individual parts
ParameterizationUse variables instead of hard-coded valuesEasy to change behavior without rewriting
DocumentationExplain the purpose and assumptionsFuture maintainers understand the intent
Separation of concernsEach part does one thingChanges to one part don't break others

Example: Hard-coded vs. Parameterized

Hard-coded (Poor Maintainability):

ALGORITHM: Student Grade Check INPUT: A student's score OUTPUT: Pass or fail STEP 1: IF score is greater than or equal to 60 THEN RETURN "Pass" ELSE RETURN "Fail" END IF END ALGORITHM
⚠️Warning

What if the passing score changes to 70? You'd need to find and update every place where 60 appears. In a large system, this could be dozens of locations.

Parameterized (Good Maintainability):

ALGORITHM: Student Grade Check INPUT: A student's score, passing_threshold OUTPUT: Pass or fail STEP 1: IF score is greater than or equal to passing_threshold THEN RETURN "Pass" ELSE RETURN "Fail" END IF END ALGORITHM
💡Tip

Now the passing score is a parameter. Change it once when calling the algorithm, and everything works. This is much easier to maintain.

Balancing the Four Pillars

In practice, you sometimes need to trade off one quality for another:

100%
ScenarioPriority OrderReason
Medical device softwareCorrectness > Efficiency > Readability > MaintainabilityLives depend on correct results
Video game renderingEfficiency > Correctness > Readability > MaintainabilityMust run at 60 frames per second
Student projectReadability > Correctness > Maintainability > EfficiencyLearning and grading matter most
Enterprise applicationMaintainability > Readability > Correctness > EfficiencyWill be modified for years

Real-World Example: Evaluating a Sorting Algorithm

Let's evaluate a sorting algorithm against all four pillars:

ALGORITHM: Selection Sort INPUT: A list of numbers OUTPUT: The same list, sorted in ascending order STEP 1: FOR each position i FROM 0 TO length - 2 DO SET min_index TO i FOR each position j FROM i + 1 TO length - 1 DO IF list[j] is less than list[min_index] THEN SET min_index TO j END IF END FOR SWAP list[i] and list[min_index] END FOR STEP 2: RETURN the sorted list END ALGORITHM

Quality Evaluation

PillarRatingExplanation
CorrectnessExcellentAlways produces a correctly sorted list
EfficiencyPoorTakes N x N steps for a list of N items
ReadabilityGoodClear structure, easy to understand the approach
MaintainabilityGoodEasy to modify (e.g., sort in descending order)
100%

Practice Exercises

Exercise 1: Find the Bug

This algorithm is supposed to calculate the average of a list of numbers. Find the correctness bug:

ALGORITHM: Calculate Average INPUT: A list of numbers OUTPUT: The average STEP 1: SET sum TO 0 STEP 2: FOR each number in the list DO SET sum TO sum + number END FOR STEP 3: RETURN sum divided by 10 END ALGORITHM

Exercise 2: Improve Readability

Rewrite this algorithm to be more readable:

ALGORITHM: X STEP 1: SET a TO 0 STEP 2: SET b TO 0 STEP 3: FOR i FROM 0 TO 9 DO STEP 4: IF list[i] > 50 THEN STEP 5: SET a TO a + 1 STEP 6: ELSE STEP 7: SET b TO b + 1 STEP 8: END IF STEP 9: END FOR STEP 10: PRINT a, b

Exercise 3: Efficiency Comparison

You need to find a specific word in a dictionary. Compare two approaches:

  • Approach A: Start at page 1 and check every word until you find it
  • Approach B: Open to the middle, check if your word comes before or after, then repeat with the appropriate half

Which is more efficient? How many steps would each take for a 1,000-page dictionary?

Exercise 4: Design for Maintainability

Rewrite this algorithm to be more maintainable:

ALGORITHM: Calculate Shipping Cost INPUT: Package weight, destination country STEP 1: IF weight is less than 1 AND country is "US" THEN RETURN 5.99 END IF STEP 2: IF weight is less than 1 AND country is "CA" THEN RETURN 8.99 END IF STEP 3: IF weight is greater than or equal to 1 AND weight is less than 5 AND country is "US" THEN RETURN 12.99 END IF ... (continues with many more hard-coded combinations)

Exercise 5: Quality Assessment

Evaluate the following algorithm for all four quality pillars. Give each pillar a rating (Excellent, Good, Fair, Poor) and explain:

ALGORITHM: Find Duplicates INPUT: A list of numbers OUTPUT: A list of numbers that appear more than once STEP 1: CREATE empty list called duplicates STEP 2: FOR each item in the list DO SET count TO 0 FOR each other_item in the list DO IF item equals other_item THEN SET count TO count + 1 END IF END FOR IF count is greater than 1 AND item is not in duplicates THEN ADD item to duplicates END IF END FOR STEP 3: RETURN duplicates END ALGORITHM

Summary

In this lesson, you learned:

  • Correctness: The algorithm must produce the right answer for all valid inputs
  • Efficiency: The algorithm should use time and resources wisely
  • Readability: The algorithm should be easy for humans to understand
  • Maintainability: The algorithm should be easy to modify when requirements change
  • Trade-offs: Different scenarios prioritize different qualities
Success

Quality algorithm design is about balance. The best algorithms are correct first, then optimized for the qualities that matter most in their specific context.

Key Terms

TermDefinition
CorrectnessProducing the right output for every valid input
EfficiencyUsing time and memory resources wisely
ReadabilityHow easily humans can understand the algorithm
MaintainabilityHow easily the algorithm can be modified
Edge CaseAn unusual input that tests the boundaries of the algorithm
Linear SearchChecking each item one by one (O(n) time)
Binary SearchRepeatedly halving the search space (O(log n) time)
ParameterizationUsing variables instead of hard-coded values
ModularityBreaking an algorithm into smaller, independent parts
Progress75%