partition 双向扫描 O(n)

利用partition可以让数组中任意元素为分隔标志,(在partition的过程中这个数必须放到最左边或者最右边,partition后在放到应该放的位置),结果是,小于或等于这个数的在它左边,大于或等于他的在他右边。

若这个数放到了左边,那么算法实现的时候要先移动right,后移动left。

若这个数放到了右边,那么算法实现的时候要先移动left,后移动right。

因为最终这个数要改变位置,最终的left和right重合的地方就是它要去的地方,而原来这个地方的数要去到最左边或最右边。

#include <bits/stdc++.h>
int a[100000]={0,3,2,8,1,3,5,6,7,3};
int partition(int a[],int left,int right){
    int pivot=a[(left+right)/2];
    std::swap(a[left],a[(left+right)/2]);
    while(left<right){
        while(left<right&&a[right]>=pivot){
            right--;                        
        }                                   
        while(left<right&&a[left]<=pivot){   
            left++;                         
        }                                       
        std::swap(a[left],a[right]);
    }
    std::swap(a[left],a[1]);
    return left;
}
int main (){
    int index=partition(a,1,9);
    std::cout<<index<<std::endl;
    int i;
    for(i=1;i<=9;i++){
        std::cout<<a[i]<<" ";
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值