问题描述
输入一个整型数组,整数取值 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 <stdio.h>
#include <stdlib.h>
void sortColors(int nums[], int n)
{
int *x1,*x2;//定义两个指针
int i;
x1