• 荷兰国旗问题


    • 问题的描述
      给定一个数组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;
    }
    
  • 相关阅读:
    随笔javascript/html5裁剪初试
    javascript开发随笔1,preventDefault的必要
    uploadify/swfupload HTTP_ERROR 406、302
    Python中__init__方法注意点
    ehcache.xsd No grammar constraints (DTD or XML Schema).
    Eclipse Organize Import 批量导包
    eclipse thymeleaf 插件安装
    windows 下 查看某个端口是否已经使用
    找符号网
    杀毒软件
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/12018838.html
Copyright © 2020-2023  润新知