利用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;
}