快速排序的改進方法
可以在選擇中樞結點時,選擇left, right,(left+right)/2三個位置中關鍵字居中的元素。
注意需要將選好的中樞結點與左端元素交換位置,因為如果不交換位置,演算法就有問題了,這是由於right--在left++先執行,導致right最後退出迴圈時指向的值一定比中樞結點值小。例如選擇的是right作為中樞結點,最後一步會把更小的值交換到最後。
void quickSort(Element arr[], int left, int right)
{
int mid;
if(left < right)
{
mid = partition_im(arr, left, right);
quickSort(arr, left, mid-1);
quickSort(arr, mid+1, right);
}
}
int partition_im(Element arr[], int left, int right)
{
Element base;
Element temp;
int base_index, mid;
mid = (left + right)/2;
base_index= median(arr, left, mid, right);//選擇三者中的中間值
base = arr[base_index];
//將中軸元素與左端點元素交換位置
if(base_index != left)
{
temp = arr[base_index];
arr[base_index] = arr[left];
arr[left] = temp;
base_index = left;
}
while(left < right)
{
while(arr[right].key >= base.key && right > left)
right--;
while(arr[left].key <= base.key && left < right)
left++;
if(left < right)
{
temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
}
arr[base_index] = arr[left];
arr[left] = base;
return left;
}