快速排序算法

快速排序算法是目前为止排序算法中教好的一种,时间复杂度为O(n*logn)

下面先简单的写下,以后有时间再更新!欢迎大家的交流!

其思想是:

  1. 一趟的思想:先在数组中选择一个数字,接下来把数组中的数字分为两个部分,比选择的数字小的数字在数组的左边,比选择的数字大的数字在右边
  2. 递归的思路分别对于每次选中的数字的左右两边排序

第一步:实现分割的代码:有两种方式,看大家谢欢!

定义的两个指针顺序的朝着同一个方向:
int Partition(int data[], int length, int start, int end){

    if (data == NULL || length <= 0 || start < 0 || end >= length)
        throw new std::exception("Invalid Parameters");

    int index = RandomInRange(start, end);
    Swap(&data[index], &data[end]);

    int small = start -1;
    for (index = start; index < end; ++index){
        if(data[index] < data[end]){
            ++small;
            if(small != index)
                Swap(&data[index], &data[end]);
        }
    }

    ++small;
    Swap(&data[small], &data[end]);

    return small;
}

定义的两个指针是相向而行的:
int Partition(int data, int length, int start, int end){
    if (data == NULL || length <= 0 || start < 0 || end >= length)
        throw new std::exception("Invalid Parameters");

    int pLeft = randomInRange(start, end);
    Swap(&data[pLeft], &data[end]);

    pLeft = start -1;
    int pRight = end;

    for(;;){
        while(data[++pLeft] < data[end]){};
        while(data[--pRight] > data[end]){};

        if(pLeft < pRight)
            Swap(&data[pLeft], &data[pRight]);
        else
            break;
    }

    Swap(&data[pLeft], &datap[end]);
    return pLeft;

 }

注意:函数RandomInRange()是用来生成start和end之间的一个随机数,其实快熟排序还有一种选取分割点数字的方式是三位取中值,即取数字的第一个数字,中间一位数字和最后一位数字,取三个数字的中间值作为分割数,代码如下:
int middle3(int data, int length, int start, int end){

    if (data == NULL || length <= 0 || start < 0 || end >= length)
        throw new std::exception("Invalid Parameters");

    int center = (start+end)/2;

    if(data[start] > data[center])
        Swap(&data[start], &data[center]);
    if(data[center] > data[end])
        Swap(&data[center], &data[end])
    if(data[start] > data[center])
        Swap(&data[start], &data[center]);

    Swap(&data[center], &data[end]);   //将中间的分割数,交换到数组最后面

 }

下面我们可以用递归的思想分别对于每次选中的数字左右两边进行排序。
 void QuickSort(int data[], int length, int start, int end){

    if(start == end)
        return;

    int index Partition(data, length, start, end);
    if(index > start)
        QuickSort(data, length, start, index-1);
    if(index < end)
        QuickSort(data, length, index+1, end);
 }


代码可能有地方有问题,后期有时间我会测试修改!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值