给定一个数组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; } }