荷兰国旗问题
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。
接下来4和5比较,less又扩充一格
这时arr[cur]==NUM
至此荷兰国旗问题得以解决,>num的放右边,<num的放左边,=num的放中间
给出c++代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <time.h>
#define max 10
using namespace std;
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void Partition(int arr[], int cur, int r, int num)
{
int less = cur - 1;
int more = r + 1;
while (cur < more)
{
if (arr[cur]<num)
{
swap(arr, ++less, cur++);//小于区域的下一个和cur交换,cur再++
}
else if (arr[cur]>num)
{
swap(arr, --more, cur);
}
else
{
cur++;
}
}
}
int main(void)
{
srand((unsigned int)time(NULL));
int arr[max];
for (int i = 0; i < max; ++i)
{
int num = rand() % 100;
arr[i] = num;
}
for (int i = 0; i < max; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
Partition(arr, 0, max - 1, 50);
for (int i = 0; i < max; ++i)
{
cout << arr[i] << " ";
}
system("pause");
return 0;
}
给出JAVA代码
public class NetherlandsFlag {
public static void main(String[] args) {
int []arr= {1,3,4,2,5};
partation(arr,0,4,3);
for(int i=0;i<5;++i)
{
System.out.println(arr[i]+" ");
}
}
public static void partation(int []arr,int l,int r,int p)//数组,当前指针,右边边界指针,比较的数
{
int less=l-1;//小于区域
int more=r+1;//大于区域
while(l<more)
{
if(arr[l]<p)
{
swap(arr,++less,l++);
}
else if(arr[l]>p)
{
swap(arr,--more,l);
}
if(arr[l]==p)
{
l++;
}
}
}
public static void swap(int []arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}