Sorting and Ranking
Rank By Count
Higher Values First
One simple ranking method counts how many values are higher than the selected value.
Program
Play the program to choose a different row and recompute its rank.
rank_by_count.f90
Replay: real traced execution (multi-file project)
program rank_by_count_demo
implicit none
integer :: values(4)
integer :: selected_index
integer :: selected_score
integer :: i
integer :: higher_count
integer :: rank
values = [14, 20, 17, 12]
selected_index = 3
selected_score = values(selected_index)
higher_count = 0
do i = 1, 4
if (values(i) > selected_score) higher_count = higher_count + 1
end do
rank = higher_count + 1
print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
end program rank_by_count_demo
program rank_by_count_demo
implicit none
integer :: values(4)
integer :: selected_index
integer :: selected_score
integer :: i
integer :: higher_count
integer :: rank
values = [14, 20, 17, 12]
selected_index = 1
selected_score = values(selected_index)
higher_count = 0
do i = 1, 4
if (values(i) > selected_score) higher_count = higher_count + 1
end do
rank = higher_count + 1
print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
end program rank_by_count_demo
program rank_by_count_demo
implicit none
integer :: values(4)
integer :: selected_index
integer :: selected_score
integer :: i
integer :: higher_count
integer :: rank
values = [14, 20, 17, 12]
selected_index = 4
selected_score = values(selected_index)
higher_count = 0
do i = 1, 4
if (values(i) > selected_score) higher_count = higher_count + 1
end do
rank = higher_count + 1
print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
end program rank_by_count_demo
values ← [14, 20, 17, 12]
10values = [14, 20, 17, 12]11selected_index = 3values this step[14, 20, 17, 12]valuesselected_index ← 3
10values = [14, 20, 17, 12]11selected_index = 312selected_score = values(selected_index)values this step3selected_indexselected_score ← 17
11selected_index = 312selected_score = values(selected_index)13higher_count = 0values this step17selected_score17values(3)higher_count ← 0
12selected_score = values(selected_index)13higher_count = 014do i = 1, 4values this step0higher_counti ← 1
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step1iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(1) > selected_scorei ← 2
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step2ihigher_count ← 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step1higher_count.true.values(2) > selected_scorei ← 3
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step3iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(3) > selected_scorei ← 4
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step4iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(4) > selected_scorerank ← 2
16end do17rank = higher_count + 118print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rankvalues this step2rank1higher_countprint '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
17 rank = higher_count + 118 print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank19end program rank_by_count_demooutput3 17 2values this step3selected_index17selected_score2rank
values ← [14, 20, 17, 12]
10values = [14, 20, 17, 12]11selected_index = 1values this step[14, 20, 17, 12]valuesselected_index ← 1
10values = [14, 20, 17, 12]11selected_index = 112selected_score = values(selected_index)values this step1selected_indexselected_score ← 14
11selected_index = 112selected_score = values(selected_index)13higher_count = 0values this step14selected_score14values(1)higher_count ← 0
12selected_score = values(selected_index)13higher_count = 014do i = 1, 4values this step0higher_counti ← 1
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step1iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(1) > selected_scorei ← 2
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step2ihigher_count ← 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step1higher_count.true.values(2) > selected_scorei ← 3
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step3ihigher_count ← 2
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step2higher_count.true.values(3) > selected_scorei ← 4
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step4iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(4) > selected_scorerank ← 3
16end do17rank = higher_count + 118print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rankvalues this step3rank2higher_countprint '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
17 rank = higher_count + 118 print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank19end program rank_by_count_demooutput1 14 3values this step1selected_index14selected_score3rank
values ← [14, 20, 17, 12]
10values = [14, 20, 17, 12]11selected_index = 4values this step[14, 20, 17, 12]valuesselected_index ← 4
10values = [14, 20, 17, 12]11selected_index = 412selected_score = values(selected_index)values this step4selected_indexselected_score ← 12
11selected_index = 412selected_score = values(selected_index)13higher_count = 0values this step12selected_score12values(4)higher_count ← 0
12selected_score = values(selected_index)13higher_count = 014do i = 1, 4values this step0higher_counti ← 1
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step1ihigher_count ← 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step1higher_count.true.values(1) > selected_scorei ← 2
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step2ihigher_count ← 2
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step2higher_count.true.values(2) > selected_scorei ← 3
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step3ihigher_count ← 3
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step3higher_count.true.values(3) > selected_scorei ← 4
13higher_count = 014do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 1values this step4iif (values(i) > selected_score) higher_count = higher_count + 1
14do i = 1, 415 if (values(i) > selected_score) higher_count = higher_count + 116end dovalues this step.false.values(4) > selected_scorerank ← 4
16end do17rank = higher_count + 118print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rankvalues this step4rank3higher_countprint '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank
17 rank = higher_count + 118 print '(I0, 1X, I0, 1X, I0)', selected_index, selected_score, rank19end program rank_by_count_demooutput4 12 4values this step4selected_index12selected_score4rank
selected row
`selected_score` copies the score from the chosen row.
higher count
Every higher value moves the selected score one rank lower.
rank
`higher_count + 1` gives first place when no values are higher.