Sri Lanka were bowled out for 131 and 177 as South Africa's four pacemen tore the batting apart handing the home side a 3-0 series whitewash.
In a dismal third day of the final Test for the tourists, Sri Lanka were able to add only 51 runs to their overnight first innings total of 80 for four and seldom looked like providing sustained resistance in the second innings, despite a fighting 50 by opening batsman Dimuth Karunaratne.
Vernon Philander and Kagiso Rabada both took three wickets in the first innings, while new cap Duanne Olivier and left-armer Wayne Parnell took two apiece.
Parnell took four wickets in the second innings, Olivier three, Rabada two and Philander one.
Sharing the new ball with Philander in the second innings, Rabada took a wicket with his first ball when Kaushal Silva gloved a catch to wicketkeeper Quinton de Kock. He added the wicket of Karunaratne, who was bowled shortly before tea.
Parnell bowled Kusal Mendis before Olivier dismissed Dhanajaya de Silva and captain Angelo Mathews, both with the help of catches at second slip by South African captain Faf du Plessis, the second a spectacular one-handed leaping effort.
Philander took his only wicket of the innings when Dinesh Chandimal was caught at first slip.
Suranga Lakmal hit out to make 31 as he and Upul Tharanga (26) added 43 for the eighth wicket before the last three wickets fell for no runs in ten balls.