快速排序(c语言)

快速排序的基本思想:

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比key值小,另外一部分的所有数据都比key值大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序的整体思路:

void QuickSort(DataType* a, int left, int right)
{
    assert(a);
    if (left >= right)
        return;
    int div = PartSort1(a, left, right);//一趟排序之后key值的位置
    QuickSort(a, left, div - 1);//对小于key的部分进行快排
    QuickSort(a, div+1, right);//对大于key的部分进行快排

}

单趟排序的三种方法:

1.左右指针法
2.挖坑法
3.前后指针法

三种方法都先以最后一个元素为key值

  • 左右指针法:
    这里写图片描述
    begin从左往右找,找到比key大的停下来;
    end从右往左找,找到比key小的停下来;
    swap(&a[begin],&a[end]);
    当begin和end相遇时,swap(&a[begin],&a[right])。

    算法如下:


int PartSort1(DataType* a, int left, int right)//左右指针法
{
    //int mid = GetMidNum(a, left, right);
    //Swap(&a[mid], &a[right]);
    DataType key = a[right];
    int begin = left, end = right;
    while (begin < end)
    {
        while (begin < end && a[begin] <= key)
        {
            begin++;
        }
        while (begin < end && a[end] >= key)
        {
            end--;
        }
        Swap(&a[begin], &a[end]);
    }
    Swap(&a[begin], &a[right]);
    return begin;
}
  • 挖坑法
    这里写图片描述

    算法如下:

int PartSort2(DataType* a, int left, int right)//挖坑法
{
    //int mid = GetMidNum(a, left, right);
    //Swap(&a[mid], &a[right]);
    DataType key = a[right];
    int begin = left;
    int end = right;
    while (begin < end)
    {
        while (begin < end&&a[begin] <= key)
        {
            ++begin;
        }
        a[end] = a[begin];
        while (begin < end&&a[end] >= key)
        {
            --end;
        }
        a[begin] = a[end];
    }
    a[begin] = key;
    return begin;
}
  • 前后指针法:
    这里写图片描述
    算法如下:
int PartSort3(DataType* a, int left, int right)//前后指针法
{/*
    int mid = GetMidNum(a, left, right);
    Swap(&a[mid], &a[right]);*/
    int prev = left - 1;
    int cur = left;
    while (cur < right)
    {
        if (a[cur] < a[right] && ++prev != cur)
        {
            Swap(&a[cur], &a[prev]);
        }
        ++cur;
    }
    Swap(&a[++prev], &a[right]);
    return prev;
}
  • 关于key值选择的优化
int GetMidNum(DataType* a, int left, int right)
{
    assert(a);
    int mid = left + ((right - left) >> 1);
    if (a[left] < a[mid])
    {
        if (a[mid]>a[left])
            return mid;
        else if (a[left] < a[right])
            return right;
        else
            return left;
    }
    else
    {
        if (a[mid]>a[right])
            return mid;
        else if (a[right] > a[left])
            return left;
        else
            return right;
    }
}

要用优化的key值只需要将代码内的注释代码放开即可。

测试代码:

void TestQuickSort()
{
    DataType a[] = { 2, 5, 6, 9, 8, 3, 1, 0, 7, 4 };
    QuickSort(a, 0, sizeof(a) / sizeof(DataType)-1);
    PrintfBuff(a, sizeof(a) / sizeof(DataType));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值