荷兰国旗问题

  • 问题的描述
    给定一个数组arr和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组中间,大于num的数放在数组的右边。
    要求额外空间复杂度为O(1),时间复杂度为O(N)。

  • C++代码实现

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

void swap(int* a,int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
/*
* 输入参数:vector<int>& v 待排序数组
           int l 左边界
		   int r 右边界
		   int p num
*/
void partition(vector<int>& v,int l,int r,int p)
{
	int current = 0; 
	int less = l - 1;  //维护< num数组的索引
	int more = r + 1;  //维护> num数组的索引

	while (current < more)
	{
		if (v[current] < p)
		{
			swap(&v[current], &v[less + 1]);
			current++;
			less++;
		}
		else if (v[current] > p)
		{
			swap(&v[current],&v[more - 1]);
//			current++;  //什么也不做,当前坐标索引向前移动即可
//这里当v[current] > p 时不用执行current++,切记!
			more--;
		}
		else  //v[current] = p 相等就直接跳下一个
		{
			current++;
		}
	}

}

void ShowVector(vector<int>& v)
{
	for (int i = 0;i < v.size();i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{

	srand((int)time(0));
	vector<int> v;
	//用随机生成的数组来测试
	for (int i = 0;i < 10;i++)
	{
		v.push_back(rand()%100);
	}
	ShowVector(v);
	partition(v,0,v.size() - 1,v[0]);
	ShowVector(v);
	return 0;
}
原文地址:https://www.cnblogs.com/Manual-Linux/p/12018838.html