A spirited England ended India’s unbeaten run in the Cricket World Cup with a 31-run victory in a high-scoring group match to boost their semi-final prospects on Sunday.

Jonny Bairstow smashed a belligerent 111, Jason Roy returned from a hamstring injury to make 66 and Ben Stokes (79) provided the late burst in England’s commanding 337-7 after electing to bat on an Edgbaston featherbed.

Rohit Sharma smashed his third hundred of the tournament and Virat Kohli his fifth successive half-century but India did not get another significant partnership and finished on 306-5.

England leapfrog Pakistan to fourth place with 10 points from eight games, while India remain second on 11 from seven matches.

“It’s been frustrating a little bit for the guys, we know how well we can play,” Bairstow said after collecting his man-of-the-match award.

“But today we were pretty good with bat, ball and in the field.

“It was the closest to a complete performance we’ve had in the competition but we also know we’ve got three must-win games in this World Cup up next.”

The hosts missed opener Roy particularly in their back-to-back defeats by Sri Lanka and Australia which had jeopardised their semi-final prospects.

The 28-year-old made an instant impact on his return, forging the tournament’s highest opening stand with Bairstow and both survived some torrid moments before tearing into the Indian attack during their 160-run stand.

Bairstow nearly deflected a couple of inside edges on to the stump and Roy got a caught-behind reprieve on 21 when he gloved Hardik Pandya.

The umpire, however, declared it wide and the Indians deliberated for a while before deciding against reviewing the decision in front of an anxious crowd of predominantly India fans.

England reached the 150 mark in the 21st over and it took a stunning catch by substitute fielder Ravindra Jadeja in the deep to send back Roy.