Quicksort is a recursive divide-and-conquer algorithm that works by selecting a pivot element and partitioning the array into two subarrays of elements less than and greater than the pivot. It recursively sorts the subarrays. The divide step does all the work by partitioning, while the combine step does nothing. It has average case performance of O(n log n) but worst case of O(n^2). Bubble sort repeatedly swaps adjacent elements that are out of order until the array is fully sorted. It has a simple implementation but poor performance of O(n^2).