剑指Offer-排序:快排

题目:

实现快排。

链接:

剑指Offer(第2版):P80

思路标签:

算法:递归

解答:

1. C++
  • 快排是基于递归操作实现的;
  • 首先从数组中随机选择一个数作为基准,与末尾的元素进行交换,放到最后一个元素的位置,方便后期比较操作;
  • 设置一个小于基准和大于基准的边界,边界一直为小于基准的最后一个数,初始设置为start-1;
  • 遍历数组,小于基准的数则交换放到边界的前面,大于基准的数则可以不变;
  • 将基准放到中间位置;
  • 上面的步骤为一次实现,称为分区(partition)操作;
  • 递归地实现左、右两个子数组的分区操作,则最终实现排序。
  • 时间复杂度:最差情况O(n^2),最佳情况O(nlogn),平均情况O(nlogn)
void swap(int* data, int i, int j){
    if(i == j) return;
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

// 分区操作
int partition(int data[], int length, int start, int end){
    if(data == nullptr || length <= 0 || start < 0 || end >= length)
        throw new std::exception("Invalid Parameter");

    int index = rand() % (end - start + 1) + start; // 随机选择基准
    swap(data, index, end);
    int small = start - 1;
    for(index = start; index < end; ++index){
        if(data[index] < data[end]){
            ++small;
            if(small != index)
                swap(data, small, index);
        }
    }

    ++small;
    swap(data, small, end);

    return small;
}


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);
}
2. python
def quick_sort(lists, left, right):
    # 快速排序
    if left >= right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left < right:
        while left < right and lists[right] >= key:
            right -= 1
        lists[left] = lists[right]
        while left < right and lists[left] <= key:
            left += 1
        lists[right] = lists[left]
    lists[right] = key
    quick_sort(lists, low, left - 1)
    quick_sort(lists, left + 1, high)
    return lists

排序相关

python:

动态图:


其他相关问题

题目: 公司员工年龄排序

几万名员工,实现排序算法,要求时间效率O(n),可以使用常量大小辅助空间,不超过O(n)。年龄范围在0~99之间。

分析:

  • 要求时间效率为O(n),所以这也说明了需要使用额外的空间才能实现。
  • 题目中仅要求对员工的年龄进行排序即可。
void sortAges(int ages[], int length){
    if(ages == nullptr || length <= 0) return;

    const int oldestAge = 99;
    int timesOfAge[oldestAge + 1];
    for(int i=0; i<=oldestAge; ++i)
        timesOfAge[i] = 0;

    for(int i=0; i<length; ++i){
        int age = ages[i];
        if(age < 0 || age > oldestAge)
            throw new std::exception("Age of out range!");

        ++timesOfAge[age];
    }

    int index = 0;
    for(int i=0; i<=oldestAge; ++i){
        for(int j=0; j<timesOfAge[i]; ++j){
            ages[index] = i;
            ++index;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值