排序算法之快速排序

快速排序的原理

一般选取带排序数组的最后一个元素作为关键字(key) ,然后设置2个指针 i(用来指向数组中小于等于key的元素) 和 j 。假如 j 指针指向数组中的元素比key要小于或者等于,那么就会交换 i 指针和j指针指向的值,按照上述规则遍历完数组结束后,交换i+1指针指向的值和end 指针指向的值。这样得到的结果是 i+1之前的元素都要比i+1这个位置的元素要小于或者等于,i+1之后的元素都要比i+1这个位置的元素要大。此时i+1这个位置上的元素已经是排好序的了。


例如 1,8,2,3,5,6,0,2  key 为 2,首先 j指向1 ,1比key要小所以对 i 执行++,i指向1,i和j进行交换(1,1交换),得到 1,8,2,3,5,6,0,2。接下来j执行++ ,j指向8,8比key要大,i还是指向1 并且 j++, j指向2,因为2 <= key 所以执行 i++ 并接交换i和j指向的值(8和2交换)得到 1,2,8,3,5,6,0,2,同理向下执行 i一直指向2(因为除了0外剩下的值都比key大),当遇到 0,交换i和j指向的值(8和0交换)得到 1,2,0,3,5,6,8,2. 循环结束后 i指向0元素所在位置 然后i+1和key交换(3和2交换)得到 1,2,0,2,5,6,8,3.  

上述过程完成后 key之前的所有值都比key要小于或者等于,key之后的所有值都比key大,并且key的位置已经是排序好的。


 快速排序执行完上述过程后 以key为分界分别对左边和右边递归的进行上述过程,直到序列排序完成。

int Partition(int *array,int start,int end)
{
    int key = array[end];
    
    int i = start - 1;
    
    for (int j = start; j < end; j++)
    {
        if (array[j] <= key)
        {
            i = i + 1;

            exchange(&array[i], &array[j]);

        }
    }

    exchange(&array[i + 1], &array[end]);
    
    return  i + 1;
}

void Quack_Sort(int* array, int start, int end)
{
    if (start < end)
    {
        int divLoc = Partition(array, start, end);
        
        Quack_Sort(array, start , divLoc - 1);
        
        Quack_Sort(array, divLoc + 1, end);
    }
    
}

时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)
不稳定。

快速排序是一种排序算法,对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
通常是用于排序的最佳选择。因为,排序最快,也只能达到O(nlgn)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值