Your best choice might be a .Net app that checks for closing auctions periodically, but you could also use a job that runs every 5 minutes, checks for any auctions ending in the next five minutes, and fires off the WinnerAlgorithm proc with a WAITFOR DELAY modifier. The job will need to be able to fire off multiple, asynchronous jobs to capture every auction ending in that 5-minute time frame:
SELECT ID FROM Auction WHERE AlgorithmIsSet = 0 and AuctionEnd < DATEADD(minute, 5, GETDATE()); -- to pull the ones you need to process
UPDATE Auction SET AlgorithmIsSet = 1 WHERE ID = 12345; -- to mark that this one is taken care of.
WAITFOR DELAY "00:04:23"; -- the exact time until the auction ends - you'll need to construct this from DATEDIFF(second, AuctionEnd, GETDATE())
EXEC WinnerAlgorithm; -- after the wait time, the auction is closed and the winner determined.
This lets the process run as soon as the auction closes. I would have the job running fairly regularly, like every five minutes, and if the agent service stops running or the machine is rebooted that first SELECT statement will pull anything not already processed. As long as you time stamp the bids you can always reconstruct the winner after the fact.