The following procedure implements quicksort:
Quicksort( int a[], int p, int r)
if p < r
q = Partition(a, p, r) // q is the position of the partition s.t. the element
// before a[q] is smaller than a[q], and greater after that.
Quicksort(a, p, q-1)
Quicksort(a, q+1, r)
The following procedures are two ways to implement partition:
First way (from Introduction to Algorithms):
Partition(int a[], int p, int r)
x = a[r] // x is the pivot: always selects a[r] as the pivot
i = p - 1 // i+1 indicates the position of the partition(pivot)
//in the resulting array
// the following loop moves elements smaller than the pivot into
//the front of the array
// i indicates the highest position of it
for j = p to r - 1
if a[j] <= x //if a[j] is larger than the pivot, do nothing, otherwise...
i = i + 1
exchange a[i] with a[j]
exchange a[i+1] with a[r] // finally, move the pivot to the position s.t.
//the element
// before a[i+1] is smaller than a[i+1],
// and greater after that.
return i + 1// and greater after that.
Second way:
partition(int array[], int low, int high)
//low= the index of the first element; high= the index of the last element int partition(int array[], int low, int high) { // The pivot is choosen to be the first element int pivot = array[low]; // After the while loop, the position of the pivot is moved to somewhere // in the middle and the elements to leftside of the pivot are smaller than it // and meanwhile, the elements to its right are larger than it. while (low < high) { // The fowlloing two while loops will move low and high index // so that the elements to left of low are smaller than the pivot // and the elements to the right of high are larger than the pivot // begining: (low)---------------high // after the while loops: --pivot --- while (low < high && array[high] >= pivot) { --high; } swap(array[low], array[high]); while (low < high && array[low] <= pivot) { ++low; } swap(array[low], array[high]); } return low; }
No comments:
Post a Comment