At the risk of stating the obvious, any CS major needs a solid understanding of combinatorics, probability, and complexity. Consider studying Concrete Mathematics to bone up on core techniques.
Basic topics you should regularly review (at least before interviewing for a competitive software engineering position):
You should know the details of at least one n*log(n) sorting algorithm, preferably two (say, quicksort and merge sort). Merge sort can be highly useful in situations where quicksort is impractical.
You should know how to implement a hash table using only arrays in your favorite language.
Be familiar with the basic tree construction, traversal and manipulation algorithms.
Familiarize yourself with binary trees, nary trees, and trietrees. Be familiar with at least one type of balanced binary tree, whether it’s a red/black tree, a splay tree or an AVL tree, and know how it’s implemented. Understand tree traversal algorithms: BFS and DFS, and know the difference between inorder, postorder and preorder.
There are 3 basic ways to represent a graph in memory (objects and pointers, matrix, and adjacency list); familiarize yourself with each representation and its pros & cons.
You should know the basic graph traversal algorithms: breadthfirst search and depthfirst search. Know their computational complexity, their tradeoffs, and how to implement them in real code. If you get a chance, try to study up on fancier algorithms, such as Dijkstra and A*.
The world is rapidly moving towards multicore, so know the fundamentals of “modern” concurrency constructs.
Know about processes, threads and concurrency issues. Know about locks and mutexes and semaphores and monitors and how they work. Know about deadlock and livelock and how to avoid them. Know what resources a processes needs, and a thread needs, and how context switching works, and how it’s initiated by the operating system and underlying hardware. Know a little about scheduling.