Zakarin won the 184.5km alpine stage from Bern to Finhaut and the Emosson dam by 55sec ahead of Sunday's 15th stage winner Jarlinson Pantano of Colombia, with Poland's Rafal Majka third at 1min 26sec.
The crowds came out to cheer the peloton along the tough route in 35C temperatures on what was the hottest day of the year in Switzerland so far.
Colombia's Nairo Quintana was the big loser, struggling in the final 2km and giving up another 28sec to Chris Froome, who pulled clear of all his main rivals except Australian Richie Porte.
Defending champion Froome followed an attack from Porte that none of his rivals could follow, with Quintana looking particularly vulnerable.
Froome, who finished the stage in 11th place, extended his lead over second-placed Bauke Mollema of the Netherlands by 40sec to 2:27, with young Briton Adam Yates third at 2:53.
But the 23-year-old Yates lost only 8sec to his compatriot Froome and is closing in on second place.
Quintana, who initially tried to follow Porte's attack and then Froome's chase before dropping off, is still fourth but now 3:27 behind.
Tasmanian Porte, who until last year was a team-mate of Froome at Sky, was the big winner as he moved up to sixth and continues to creep up on a podium position.
See the stage in pictures with our gallery:
IN PICTURES: the Tour de France comes to Switzerland