快速排序

快速排序采用的是分治递归的策略
(1)选取枢纽元:采用三数中值分割法来选取枢纽元,一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元
(2)分割策略
首先,通过枢纽元与最后的元素交换,使得枢纽元离开要被分割的数据段(即i从第一个元素开始,而j从倒数第二个元素开始)
接着,在分割段要做的是把所有比枢纽元小的元素移到数组左边,而把所有比枢纽元大的元素移到数组的右边。当i和j停止时,i指向一个大于枢纽元的元素,而j指向一个小于枢纽元的元素。此时,若i小于j,则将i,j处的元素交换,否则退出循环
最后,将枢纽元与i所指向的元素交换

快速排序为不稳定的排序,其时间复杂度最差为O(n2),平均为O(nlogn),空间复杂度为O(logn)

void Swap(int *a, int *b);//交换两元素的值
int Median3(int A[], int Left, int Right);//三数中值分割法
void InsertSort(int A[], int size);//插入排序
void Qsort(int A[], int Left, int Right);//快速排序子函数
void QuickSort(int A[], int size);//快速排序函数

int main(void)
{
int A[] = {8,1,4,9,0,4,3,5,4,2,7,7,6,8};
int i, size = sizeof(A)/sizeof(int);

QuickSort(A, size);//快速排序
for(i = 0; i < size; i++)
{
    printf("%d ", A[i]);
}
printf("\n");

return 0;

}

void Swap(int *a, int *b)//交换两元素的值
{
int temp;

temp = *a;
*a = *b;
*b = temp;

}

int Median3(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int Center = (Left + Right)/2;

if(A[Left] > A[Center])
    Swap(&A[Left], &A[Center]);
if(A[Left] > A[Right])
    Swap(&A[Left], &A[Right]);
if(A[Center] > A[Right])
    Swap(&A[Center], &A[Right]);

Swap(&A[Center], &A[Right-1]);//将枢纽元放在数组的倒数第二个位置上,最后一个元素肯定大于枢纽元

return A[Right-1];

}

void InsertSort(int A[], int size)
{
int i, j;
int temp;

for(i = 1; i < size; i++)
{
    temp = A[i];
    for(j = i; (j >0) && (A[j-1]) > temp; j--)
    {
        A[j] = A[j-1];
    }
    A[j] = temp;
}

}

void Qsort(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int i, j;
int Pivot;//枢纽元
int Cutoff = 3;

if(Left + Cutoff <= Right)//当参与排序的元素个数大于3时
{
    Pivot = Median3(A, Left, Right);
    i = Left;   j = Right-1;
    while(1)
    {
        while(A[++i] < Pivot){}
        while(A[--j] > Pivot){}
        if(i < j)
            Swap(&A[i], &A[j]);
        else
            break;
    }
    Swap(&A[i], &A[Right-1]);//将枢纽元与i所指的元素交换

    Qsort(A, Left, i-1);//对枢纽元左边的元素进行快速排序
    Qsort(A, i+1, Right);//对枢纽元右边的元素进行快速排序
}
else//当参与排序的元素个数不大于3时
{
    InsertSort(A+Left, Right-Left+1);//采用插入排序
}

}

void QuickSort(int A[], int size)
{
Qsort(A, 0, size-1);
}

另一种实现方法:
void myqort(int *a, int len)
{

if (a == NULL || len <= 1)
    return;

int val = a[0];
int start = 0;
int end = len-1;

while (start < end)
{
    while (start < end)
    {
        if (a[end] < val)
        {
            a[start++] = a[end];
            break;
        }
        end--;
    }
    while (start < end)
    {
        if (a[start] > val)
        {
            a[end--] = a[start];
            break;
        }
        start++;
    }
}

a[start] = val;

myqort(a, start);
myqort(a+start+1, len-start-1);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值