change pivot in my quickSort algorithm java

末鹿安然 提交于 2019-12-02 07:59:39

You could simply swap the pivot you chose with the first element in the array before you start sorting, that way it'll work exactly as before.

int l = start;
int r = end;

this.swap(a, choosePivot(), start); 
int pivotIndex = start; 

If you choose to start with pivoting on an arbitrary element you have to change the behavior of your partitioning loop. See the code below:

/* Selecting the pivot to be a random-ish element
   and pivotIndex to be beginning, since we don't know
   where it will be until we loop through the list */
int pivot = a[someInt];
int pivotIndex = begin-1;
//have to keep track of where the pivot actually is in the list
int currentPivotIndex = someInt;

for(int i = begin; i <= end; i++) {
    if(a[i] <= pivot) {
        //for each element less than the pivot
        //the pivotIndex moves by one
        pivotIndex++;
        //place the element to the left of the pivot
        this.swap(a, pivotIndex, i);
        //update currentPivotIndex if needed
        if(a[pivotIndex] == pivot) {
            currentPivotIndex = pivotIndex;
        }
    }
}
//put the pivot in its place
this.swap(a, pivotIndex, currentPivotIndex);

This is some odd behavior which is most probably caused by having your pivot element engage in partitioning.

The first line of the output says swapping l:8 and r:4 but it should have been swapping l:8 and r:3. Because 4 is the pivot element and it doesn't belong to the partition on the left, nor to the partition on the right. It's the element in the middle of the partitions. It has to be isolated during partitioning.

To fix this issue, after you select your pivot, move it to the end. I.e, first thing, replace pivot with the last element of the array. Therefore, you can isolate it from the partitioning process. Then start the while loop with l = start and r = end - 1 because end is currently pivot. Leave it alone. After you're done with partitioning, restore the pivot in the middle of the two partitions. The middle would be where l and r meet.

I believe following the above approach would fix your problem. Let me know if it doesn't.

Not directly related but your choice of the pivot element has a huge effect on the performance of quicksort. With its current version, hitting the worst-case (O(n^2)) is likely. Most simply, you can choose it randomly, which brings O(nlogn) complexity with high probability.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!