数组0,1和数组0,1,2排序

数组有0和1,将0排在1之前
思路:
采用两个指针,一个从前一个从后。
p0找到不为0的值,p1找不到不为1的值,二者进行交换。

void sort2(int* arr,int len)
{
	int p0=0;
	int p1=len-1;
	while(p0<=p1)
	{
		if(arr[p0]==0)
			p0++;
		if(arr[p1]==1)
			p1--;
		swap(arr[p0],arr[p1]);
		p0++;
		p1--;	
	} 
}

数组有0,1和2,将0排在1之前,1排在2之前
时间复杂度O(n)
思路:
通过三个下标遍历一遍实现的方法。

p0从左侧开始,指向第一个非0的数字;p2从右侧开始,指向第一个非2的数字。

p1从p0开始遍历,如果是1,p1继续遍历,直到p1遇到0或者2

如果遇到0,则和p0进行交换,然后p0向右,指向第一个非0的数字

如果遇到2,则和p2进行交换,然后p2向左,指向第一个非2的数字

#include
using namespace std;
void sort(int* arr,int len)
{
	int p0=0;
	int p2=len-1;
	int p1;
	//找到第一个非0的位置 
	while(arr[p0]==0&&p0<len)
		p0++; 
	while(arr[p2]==2&&p2>=0)
		p2--;
	p1=p0;
	while(p1<=p2)
	{
		if(arr[p1]==1)
			p1++;
		else if(arr[p1]==0)
		{
			swap(arr[p0],arr[p1]);
			while(arr[p0]==0&&p0<len)
				p0++;
		}
		else
		{
			swap(arr[p2],arr[p1]);
			while(arr[p2]==2&&p2>=0)
				p2--;
		}
	}
}
int main()
{
	int arr[11]={1,2,0,1,1,1,0,2,0,1,2};
	sort(arr,11);
	for(int i=0;i<11;i++)
	{
		cout<<arr[i];
	}
 
}

你可能感兴趣的:(笔试题)