优化选取基准点
优化基准点 使其不达到极端状态 或者说 使其用基准点划分想对平衡
找下标最左边 中间 以及最右边的值 取三者的中间值作为基准点 这称为三数取中 只需要改变 get_mid() 函数
int get_mid(int a[],int left,int right)
{
int mid=left+(right-left)/2;
if(a[left]>a[right])
{
swap(a[left],a[right]);
}
if(a[mid]>a[right])
{
swap(a[mid],a[right]);
}
if(a[left]<a[mid])
{
swap(a[left],a[mid]);
}
int pivot=a[left];
while(left<right)
{
while(a[right]>=pivot&&left<right)
{
right--;
}
a[left]=a[right];
while(a[left]<=pivot&&left<right)
{
left++;
}
a[right]=a[left];
}
a[left]=pivot;
return left;
}
优化小数组时的排序方案
当划分成较为小的数组时,直接插入排序的效率会更高
设置小于7时用直接插入排序
void ISort(int a[],int n)
{
int i,j;int temp;
for(i=1;i<n;i++)
{
temp=a[i];
j=i-1;
while(temp<a[j]&&j>=0)
{
a[j+1]=a[j];j--;
}
a[j+1]=temp;
}
}
void InsertSort(int a[],int left,int right)
{
ISort(a+left,right-left+1);
}
int get_mid(int a[],int left,int right)
{
int pivot=a[left];
while(left<right)
{
while(a[right]>=pivot&&left<right)
{
right--;
}
a[left]=a[right];
while(a[left]<=pivot&&left<right)
{
left++;
}
a[right]=a[left];
}
a[left]=pivot;
return left;
}
void quicksort(int a[],int left,int right)
{
if(left-right<littletable)
{
if(left<right)
{
int mid=get_mid(a,left,right);//第一步小放左 大放右
quicksort(a,left,mid-1);
quicksort(a,mid+1,right);
}
}
else
{
InsertSort(a,left,right);
}
}
特别注意重新封装插入排序函数
使用插入函数时注意传参 qsort()的左边或者右边数组的开始位置以及长度要注意
void ISort(int a[],int n)
{
int i,j;int temp;
for(i=1;i<n;i++)
{
temp=a[i];
j=i-1;
while(temp<a[j]&&j>=0)
{
a[j+1]=a[j];j--;
}
a[j+1]=temp;
}
}
void InsertSort(int a[],int left,int right)
{
ISort(a+left,right-left+1);
}