75.颜色分类

方法一:

两遍扫描:

扫描第一遍,记录0、1、2的个数;

扫描第二遍,重填数组。

/*

*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<iostream>
void sortColors(int* nums, int numsSize){

    int i,j,k,n=numsSize,t;
    i=j=k=0;
    for(t=0;t<n;t++){
        if(nums[t]==0) i++;
        if(nums[t]==1) j++;
        if(nums[t]==2) k++;
    }
    t=0;
    while(t<n){
            printf("1\n");
        while(i){
            nums[t]=0;
            i--;
            t++;
        }
        while(j){
            nums[t]=1;
            j--;
            t++;
        }
        while(k){
            nums[t]=2;
            k--;
            t++;
        }

    }
}
int main()
{
    int* nums, numsSize=6,a[6]={2,0,2,1,1,0},i;
    nums=(int*)malloc(sizeof(int)*6);

    nums=a;

    sortColors(nums,numsSize);
    for(i=0;i<numsSize;i++){
        printf("%d ",nums[i]);
    }
    //printf("%d\n",rs);
    return 0;
}

 方法二:

荷兰国旗问题,实则是三指针快排。

用p0记录0的最右边界;cur记录1的位置;p2记录2的最左边界。

1、初始化

p0=0;cur=0;p2=numsSize-1;

2、循环(cur<=p2)

  如果nums[cur]=0,交换nums[cur]与nums[p0],cur++,p0++;

  如果nums[cur]=1,cur++;

  如果nums[cur]=2,交换nums[cur]与nums[p2],p2--;

/*

*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<iostream>
void swap(int nums[],int i,int j){
    int t=nums[i];
    nums[i]=nums[j];
    nums[j]=t;
}
void sortColors(int* nums, int numsSize){
    int p0=0,p2=numsSize-1,cur=0;
    while(cur<=p2){
        if(nums[cur]==0){
            swap(nums,p0,cur);
            p0++;
            cur++;
        }else if(nums[cur]==2){
            swap(nums,p2,cur);
            p2--;
        }else{
            cur++;
        }
    }
}
int main()
{
    int* nums, numsSize=6,a[6]={2,0,2,1,1,0},i;
    nums=(int*)malloc(sizeof(int)*6);

    nums=a;

    sortColors(nums,numsSize);
    for(i=0;i<numsSize;i++){
        printf("%d ",nums[i]);
    }
    //printf("%d\n",rs);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhaohuan1996/p/12749674.html