设有一个元素为整数的线性表L,放在A[0.....n]中,设计一个算法以A[n-1]为参考量,使数组左部分小于A[n],右部分大于A[n-1],要求结果仍然保存在数组中。
分析:本题属于快排算法的划分部分。
void Q_partition(int a[],int n)//n是数组的长度
{
int i,j;
i=0,j=n-1;
int temp;
temp =a[j];
a[j]=a[i];
a[i]=temp;
temp =a[i];
while(i!=j)
{
while(j>i&&a[j]>temp)//从右往左扫找到小于temp的元素
j--;
if(i<j)//找到该元素填入a[i]这个空位。
{
a[i]=a[j];
i++;
}
while(i<j&&a[i]<temp)//从左往右扫找到大于temp的元素。
i++;
if(i<j)
{
a[j]=a[i];//找到该元素填入该空位。
j++;
}
}
a[i]=temp;//最后将枢轴放入它在有序数组所在的位置。
}
注:以上解法来自天勤
我的思路:如果仅仅在一趟排序中确定待排元素的位置,可以通过for循环找到小于a[n-1]的元素个数number,然后a[n-1]的值插到a[number]中,后面的元素后移一位。然后在0number-1内找比a[number]大的数将其与在number+1n-1的数进行交换。找到就跳出。
void myPartition(int a[],int n)
{
int i=0,j=0;
int number=0;
int temp;
for(;i<n-1;i++)
{
if(a[i]<a[n-1])
number++;
}
temp=a[number];
a[number]=a[n-1];
for(i=n-1;i>number;i--)
{
a[i+1]=a[i];
}
a[number+1]=temp;
for(i=0;i<number;i++)
{
if(a[i]>a[number])
{
for(j=number+1;j<n;j++)
{
if(a[j]<a[number])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
break;
}
}
}
}
for(i=0;i<n;i++)
{
cout<<' '<<a[i];
}
}