左轴演算、中轴演算、右轴演算
题目:
高速排序法(quick sort)是眼下所公认最快的排序方法之中的一个(视解题的对象而定),尽管高速排序法在最差状况下能够达O(n2)。可是在多数的情况下,高速排序法的效率表现是相当不错的。
高速排序 - 算法
1、高速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二
2、分别对左边与右边数列进行排序
左轴演算:
// 高速排序 - 左轴演算
// 1. 附设两个指针left/right,并设最左端的数为最初枢轴pivot
// 2. 从右向左搜索,找到第一个比pivot小的数,将其缓存进枢轴位置
// 3. 从左向右搜索,找到第一个比pivot大的数。缓存进上一个比pivot小的数的位置程式进入2.循环
// 4. 最后一次交换后获得的有效空位置为a[i] ,此时再将pivot赋值给a[i] 此时a[i]左边的数比a[i]小,右边的数比a[i]大
// 再分别对其左边与左边进行高速排序
int QuickSort2(int a[],int left,int right)
{
if(left<right)
{
int i = left,j=right,pivotloc=a[left];
while(i < j)
{
while(i<j && a[j]>=pivotloc) j--;
if(i<j) a[i++]=a[j];
while(i<j && a[i]<pivotloc)i++;
if(i<j) a[j--]=a[i];
}
a[i]=pivotloc;
QuickSort2(a,left,i-1);
QuickSort2(a,i+1,right);
}
return 0;
}
int QuickSort5(int a[],int left,int right)
{
if(left<right)
{
int i = left,j=right,pivotloc=a[left];
while(i < j)
{
while(i<j && a[i]<=pivotloc) i++;
while(i<j && a[j]>pivotloc) j--;
if(i<j)
{
SWAPER(a[i],a[j]);
i++;j--;
}
}
if(a[j]<a[left])
{
SWAPER(a[left],a[j]);
}
QuickSort5(a,left,j-1);
QuickSort5(a,j,right);
}
return 0;
}
中轴演算
// 高速排序
int QuickSort3(int a[],int left,int right)
{
int i,j,pivot;
if(left<right)
{
pivot=a[(left+right)/2];
i=left-1;
j=right+1;
while(i<j)
{
while(a[++i]<pivot) ;
while(a[--j]>pivot) ;
if(i<j) SWAPER(a[i],a[j]);
}
QuickSort3(a,left,i-1);
QuickSort3(a,j+1,right);
}
return 0;
}
右轴演算
// 高速排序演算
// 1. 首先选择最右边的元素作为枢轴pivot
// 2. 从左向右搜索,寻找小于pivot的数,将其与左边第一个未交换的元素交换
// 3. 当搜索到最右边时,左边已交换的数都比pivot小。而未交换的都比pivot大
// 4. 将左边的第一个未交换的元素与最右边的pivot元素交换,并返回该未交换元素的索引
// 此时i左边的元素比i小,右边的比i大
// 程式进入.循环分别对0 →i -1 及最右边的i+1→right进行递归(高速排序) 终于该序列会变为有序
int Partition2(int a[],int left,int right)
{
int i = left,j;
int pivot=a[right];
for(j=left;j<right;j++)
{
if(a[j]<pivot)
{
if(i!=j)SWAPER(a[i],a[j]);
i++;
}
}
if(i!=right)SWAPER(a[i],a[right]);
return i;
}
int QuickSort4(int a[],int left,int right)
{
int pivot;
if(left<right)
{
pivot=Partition2(a,left,right);
QuickSort4(a,left,pivot-1);
QuickSort4(a,pivot+1,right);
}
return 0;
}