荷兰国旗问题1.0
题目描述: 给定一个 无序的数组 和 一个数num,要求最终该数组 左侧为<=num的数,右侧为>num的数,左右侧的数不用有序。
当然了,该题有很多解法,但可能你第一时间想到的是再创建一个数组,分别在原数组中找出合适的数,然后依次放进去,那么如果不创建数组的话,该如何解决呢?
以下为代码:
#include<stdio.h>
void Netherlandsflag(int arr[],int num,int L,int R);
void swap(int arr[],int index,int left);
int main()
{
int arr[5]={1,3,4,2,5};
int num=3;
Netherlandsflag(arr,num,0,4);
//控制输出格式,使结果更加明了
int i,flag=0;
for(i=0;i<=4;i++)
{
printf("%d ",arr[i]);
if(arr[i+1]>num&&flag==0)
{
printf(") ");
flag=1;
}
}
}
void Netherlandsflag(int arr[],int num,int L,int R)
{
int index=0;//index表示每次要比较的数
int leftborder=-1;//左组边界
while(index<=R)
{
if(arr[index]<=num)
{
swap(arr,index,leftborder+1);
index++;
leftborder++;
}
else
index++;
}
}
//数组元素交换
void swap(int arr[],int index,int left)
{
int temp;
temp=arr[left];
arr[left]=arr[index];
arr[index]=temp;
}
我们从-1处出发,始终用arr[index]去和num作比较,若前者小,则左边界-1向右拓展,同时index也向右拓展(考虑到arr[index]不始终为左组的下一个数,所以我们用arr[index]与左组的下一个数做交换后进行拓展);若后者小,则index向后走,左边界不变。最后直到index越界。
好了,接下来大家想想如果 最终结果要求 左组<num 中间为 num 右组 >num。这该怎么办呢? 下期揭晓!!!