荷兰国旗问题
-
问题的描述
给定一个数组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;
}