zoukankan      html  css  js  c++  java
  • 荷兰国旗问题

    • 问题的描述
      给定一个数组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;
    }
    
  • 相关阅读:
    在vs2008中集成JavaScript Lint检查JavaScript语法
    (转载)SQL分页语句
    设置出错页
    判断2个输入框至少输入1个
    C#获取用户桌面等特殊系统路径
    创建存储过程的代码
    SqlParameter关于Like的传参数无效问题
    (转)利用Office里面的OWC组件进行画图
    firefox3不能获得html file的全路径的问题
    (转)使用ASP.NET上传图片汇总
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/12018838.html
Copyright © 2011-2022 走看看