手撕排序

快排

void quick_sort(vector<int>& nums, int l, int r){
    if(l < r){
        int i = l, j = r;
        while(i < j){
            while(i < j && nums[j] >= nums[l]) --j; //  nums[l] 作为分界
            while(i < j && nums[i] <= nums[l]) ++i;
            swap(nums[i], nums[j]);
        }
        swap(nums[l], nums[i]);
        quick_sort(nums, l, i - 1);
        quick_sort(nums, i + 1, r);
    }
}

归并排序

vector<int> tmp;
    void merge_sort(vector<int>& nums, int l, int r){
        if(l >= r) return;
        int mid = l + (r - l) / 2;
        merge_sort(nums, l, mid);
        merge_sort(nums, mid+1, r);
        int i = l, j = mid+1;
        int cur = 0;
        while(i<=mid && j<=r){
            if(nums[i] <= nums[j]){
                tmp[cur++] = nums[i++]; 
            }else{
                tmp[cur++] = nums[j++];
            }
        }
        while(i<=mid){
            tmp[cur++] = nums[i++];
        }
        while(j<=r){
            tmp[cur++] = nums[j++];
        }
        for(int i=0; i<r-l+1; ++i){
            nums[i+l] = tmp[i];
        }
    }

堆排序

void maxHeapify(vector<int>& nums, int i, int len) {
    for (; (i << 1) + 1 <= len;) {
        int lson = (i << 1) + 1;
        int rson = (i << 1) + 2;
        int large;
        if (lson <= len && nums[lson] > nums[i]) {
            large = lson;
        } else {
            large = i;
        }
        if (rson <= len && nums[rson] > nums[large]) {
            large = rson;
        }
        if (large != i) {
            swap(nums[i], nums[large]);
            i = large;
        } else {
            break;
        }
    }
}
void buildMaxHeap(vector<int>& nums, int len) {
    for (int i = len / 2; i >= 0; --i) {
        maxHeapify(nums, i, len);
    }
}
void heapSort(vector<int>& nums) {
    int len = (int)nums.size() - 1;
    buildMaxHeap(nums, len);
    for (int i = len; i >= 1; --i) {
        swap(nums[i], nums[0]);
        len -= 1;
        maxHeapify(nums, 0, len);
    }
}
  • 时间复杂度:O(nlogn)O(nlog n)O(nlogn)。初始化建堆的时间复杂度为 O(n)O(n)O(n),建完堆以后需要进行 n-1n−1 次调整,一次调整(即 maxHeapify) 的时间复杂度为 O(logn)O(logn)O(logn),那么 n-1n−1 次调整即需要 O(nlogn)O(nlogn)O(nlogn) 的时间复杂度。因此,总时间复杂度为 O(n+nlogn)=O(nlogn)O(n+nlogn)=O(nlogn)O(n+nlogn)=O(nlogn)

  • 空间复杂度:O(1)O(1)O(1)。只需要常数的空间存放若干变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值