荷兰国旗问题
给定一个整数数组,给定一个值K,这个值在原数组中一定存在,要求把数组中小于K的元素放到数组的左边,大于K的元素放到数组的右边,等于K的元素放到数组的中间,最终返回一个整数数组,其中只有两个值,分别是等于K的数组部分的左右两个下标值。
例如,给定数组:[2, 3, 1, 9, 7, 6, 1, 4, 5],给定一个值4,那么经过处理原数组可能得一种情况是:[2, 3, 1, 1, 4, 9, 7, 6, 5], 需要注意的是,小于4的部分不需要有序,大于4的部分也不需要有序,返回等于4部分的左右两个下标,即[4, 4]
解析:有一点快排的思想。把数组分成三个区域,分别是less,equal,more。一直都是less区域推着equal区域挤压more区域。
#include<bits/stdc++.h>
using namespace std;
void swap(int *a,int n,int m)//交换数据
{
int t;
t=a[n];
a[n]=a[m];
a[m]=t;
}
void partition(int *a,int L,int R,int num)
{
int less=L-1;
int more=R+1;
while(L<more)
{
//L一直都是指向正在进行比较的数字
if(a[L]<num)//如果小于num,less区域就要向右扩大,less++和L进行交换
swap(a,++less,L++);
else if(a[L]>num)//如果小于num,more区域就要向左扩大,--more和L进行交换
swap(a,L,--more);
else if(a[L]==num)//如果等于num,则直接把L++,这样即可保证相等区域一直没有变动。
{
L++;
}
}
}
int main()
{
int n,num;
cin>>n>>num;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
partition(a,0,n-1,num);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}