快速排序设置枢轴

设有一个元素为整数的线性表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];
        }
}

原文地址:https://www.cnblogs.com/jearchen/p/9819884.html