user1354784
user1354784

Reputation: 406

O(nlogn) in-place sorting algorithm

This question was in the preparation exam for my midterm in introduction to computer science.

There exists an algorithm which can find the kth element in a list in O(n) time, and suppose that it is in place. Using this algorithm, write an in place sorting algorithm that runs in worst case time O(n*log(n)), and prove that it does. Given that this algorithm exists, why is mergesort still used?

I assume I must write some alternate form of the quicksort algorithm, which has a worst case of O(n^2), since merge-sort is not an in-place algorithm. What confuses me is the given algorithm to find the kth element in a list. Isn't a simple loop iteration through through the elements of an array already a O(n) algorithm?

How can the provided algorithm make any difference in the running time of the sorting algorithm if it does not change anything in the execution time? I don't see how used with either quicksort, insertion sort or selection sort, it could lower the worst case to O(nlogn). Any input is appreciated!

Upvotes: 2

Views: 7749

Answers (4)

Javier Cano
Javier Cano

Reputation: 621

Quick sort have worstcase O(n^2), but that only occurs if you have bad luck when choosing the pivot. If you can select the kth element in O(n) that means you can choose a good pivot by doing O(n) extra steps. That yields a woest-case O(nlogn) algorithm. There are a couple of reasons why mergesort is still used. First, this selection algorithm is more or less cumbersome to implement in-place, and also adds several extra operations to the regular quicksort, so it is not that fastest than merge sort, as one might expect.

Nevertheless, MergeSort is not still used because of its worst time complexity, in fact HeapSort achieves the same worst case bounds and is also in place, and didn't replace MergeSort, though it has also other disadvantages against quicksort. The main reason why MergeSort survives is because it is the fastest stable sort algorithm know so far. There are several applications in which is paramount to have an stable sorting algorithm. And that is the strength of MergeSort.

A stable sort is such that the equal items preserve the original relative order. For example, this is very useful when you have two keys, and you want to sort by first key first and then by second key, preserving the first key order.

The problem with HeapSort against quicksort is that it is cache inefficient, since you swap/compare elements too far from each other in the array, while quicksort compares consequent elements, these elements are more likely to be in the cache at the same time.

Upvotes: 0

user1354784
user1354784

Reputation: 406

I found the solution:

if(start>stop)                              2 op.                                                           
    pivot<-partition(A, start, stop)        2 op. + n
    quickSort(A, start, pivot-1)            2 op. + T(n/2)
    quickSort(A, pibvot+1, stop)            2 op. + T(n/2)

T(n)=8+2T(n/2)+n            k=1
    =8+2(8+2T(n/4)+n/2)+n
    =24+4T(n/4)+2n          K=2
    ...
    =(2^K-1)*8+2^k*T(n/2^k)+kn

Recursion finishes when n=2^k <==> k=log2(n)

T(n)=(2^(log2(n))-1)*8+2^(log2(n))*2+log2(n)*n
    =n-8+2n+nlog2(n)
    =3n+nlog2(n)-8
    =n(3+log2(n))-8
    is O(nlogn)

Upvotes: 0

rcgldr
rcgldr

Reputation: 28921

Reasons for merge sort. Merge Sort is stable. Merge sort does more moves but fewer compares than quick sort. If the compare overhead is greater than move overhead, then merge sort is faster. One situation where compare overhead may be greater is sorting an array of indices or pointers to objects, like strings.

If sorting a linked list, then merge sort using an array of pointers to the first nodes of working lists is the fastest method I'm aware of. This is how HP / Microsoft std::list::sort() is implemented. In the array of pointers, array[i] is either NULL or points to a list of length pow(2,i) (except the last pointer points to a list of unlimited length).

Upvotes: 0

Aivean
Aivean

Reputation: 10882

Check wiki, namely the "Selection by sorting" section:

Similarly, given a median-selection algorithm or general selection algorithm applied to find the median, one can use it as a pivot strategy in Quicksort, obtaining a sorting algorithm. If the selection algorithm is optimal, meaning O(n), then the resulting sorting algorithm is optimal, meaning O(n log n). The median is the best pivot for sorting, as it evenly divides the data, and thus guarantees optimal sorting, assuming the selection algorithm is optimal. A sorting analog to median of medians exists, using the pivot strategy (approximate median) in Quicksort, and similarly yields an optimal Quicksort.

The short answer why mergesort is prefered over quicksort in some cases is that it is stable (while quicksort is not).

Upvotes: 1

Related Questions