荷兰国旗问题

扫码查看
  • 问题的描述
    给定一个数组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;
}
12-17 11:57
查看更多