数据结构实验——荷兰国旗问题(三色排列)

问题描述

输入一个整型数组,整数取值 0,1,2,可以重复。输出排序后的结果。 要求设计一个排序算法,常数辅助空间和一遍扫描。

示例 1:
输入: 0 1 0 1 2 0 1 0 1 0 2 2 0 1
输出: 0 0 0 0 0 0 1 1 1 1 1 2 2 2
示例 2:
输入: 1 0 2 0 1 1 2 0 2 1
输出: 0 0 0 1 1 1 1 2 2 2

问题分析

  • 由题目的要求,我们可以知道,这个问题较为特殊。首先,元素的只有三种,其次,常数辅助空间,最后,一边扫描
  • 故经过分析,我们可以通过只有三个未知数想到运用两个指针来进行排序

两个指针均从数组头开始扫描:
有以下几种情况:

  • 扫描到0时,进行交换,将p2所指的值赋给扫描位的值,p1所指的值赋值给p2所指的位的值,p1所指的位的值赋0,指针p1和指针p2均向后移动一位
  • 扫描到1时,将p2所指的值赋值给扫描位,p2所指的位的值赋值为1,指针p1不动,p2指针向后移动一位
  • 扫描到2时,什么也没发生,继续向后扫描
  • 重复以上三个步骤,直到扫描完成,也就完成了排序

源代码

#include 
#include 

void sortColors(int nums[], int n)
{
    int *x1,*x2;//定义两个指针
    int i;
    x1=nums;//指针指向数组头
    x2=nums;//指针指向数组头
    for(i=0;i<n;i++)//for循环遍历一次数组
    {
        if(nums[i]!=0&&nums[i]!=1&&nums[i]!=2)//排除非法输入
        {
            printf("Error!!!\n");
            exit(0);
        }
        else if(nums[i]==0)//如果读到0进行如下交换后两个指针向后移
        {
            nums[i]=*x2;
            *x2=*x1;
            *x1=0;
            x1++;
            x2++;
        }
        else if(nums[i]==1)//读到1则进行如下交换后,x2指针向后移
        {
            nums[i]=*x2;
            *x2=1;
            x2++;
        }
    }
}

int main()
{
    int nums[1000];
    int n , i = 0;
    printf("please input n:\n");
    scanf("%d", &n);
    printf("please input number:\n");
    for (i = 0; i < n; i++)
    {
        scanf("%d", &nums[i]);
    }
    sortColors(nums, n);
    printf("result:\n");
    for (i = 0; i < n; i++)
    {
        printf("%d ", nums[i]);
    }
    return 0;
}

你可能感兴趣的:(数据结构,应用)