优化点:
优化选取中轴元素
以上代码target 选取的位置是认定了数组元素的首位,但是若这个数值的大小不在整个数组的中间位置,会大大降低快排的性能。
target =array[low] 这句就成了一个潜在的性能瓶颈。因此快速排序的速度还取决于这个target关键元素在数组中的位置。 【改进方法】
三数取中法:去三个元素先进行排序,将中间数作为中轴元素,下面的代码选取数组的左、中、右三个数;
#include <iostream>
using namespace std;
void Swap(int &x,int &y)
{
int temp = x;
x = y;
y = temp;
}
int partition(int * arr,int low,int high)
{
int mid = (low+high)/2; //取中间数下标
if(arr[high] < arr[low])
{
Swap(arr[low],arr[high]);
}
if(arr[high]<arr[mid])
{
Swap(arr[mid],arr[high]);
}
//前2个if保证最后一个数是最大的
//这个if是保证第一个数的值是三个数中第二大的
if(arr[mid]>arr[low])
{
Swap(arr[low],arr[mid]);
}
//选好后就正常些快速排序了
int pv = arr[low];
while(low<high)
{
while(low<high&&arr[high] >=pv)
{
high--;
}
Swap(arr[low],arr[high]);
while(low<high&&arr[low] <=pv)
{
low++;
}
Swap(arr[low],arr[high]);
}
return low;
}
void Quick_Sort(int * arr,int low,int high)
{
if(low<high)
{
int pv = partition(arr,low,high);
Quick_Sort(arr,low,pv-1);
Quick_Sort(arr,pv+1,high);
}
}
int main()
{
int arr[10];
Quick_Sort(arr,0,9);
for(int i = 0;i<10;i++)
{
arr[i] = rand();
}
for(int i = 0;i<10;i++)
{
cout<<arr[i]<<endl;
}
system("pause");
return 0;
}