c++一些小算法

目录

一、排序算法

1.冒泡排序

2.选择排序

3.插入排序

4.快排

5.希尔排序

6.归并排序

二、C++中vector,set,map自定义排序

1.vector

(1)逆序

2.set

(1)逆序

3.map

(1)key值,逆序

(2)key值,自定义排序

(3)value,排序

三、其他

1.C++ 利用set为vector数组去重

2.统计数组(或者向量)中各元素出现的次数

3.在vector中查找元素及其位置

4.在string中查找元素及其位置



一、排序算法

1.冒泡排序

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void BubbleSort(vector<int> &arr, int len)
{
	int temp = {0};
	for (int i = 0; i < len - 1; ++i)
	{
		for (int j = 0; j < len - 1 - i; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}
int main() {
	vector<int> B;
	cout << "请输入3个数字!" << endl;
	int temp;
	for (int i = 0; i < 3; i++) {
		cin >> temp;
		B.push_back(temp);
	}
	int l = B.size();
	BubbleSort(B, l);
	vector<int>::iterator it;
	for (it = B.begin(); it != B.end(); it++)
		cout << *it << endl;
	system("pause");
	return 0;
}

2.选择排序

void selectSort(vector<int> &a, int len)
{

	int minindex, temp;
	for (int i = 0; i < len - 1; i++)
	{
		minindex = i;
		for (int j = i + 1; j < len; j++)
		{
			if (a[j] < a[minindex])
				minindex = j;
		}
		temp = a[i];
		a[i] = a[minindex];
		a[minindex] = temp;
	}
}

3.插入排序

void insertSort(vector<int> &arr, int n)
{
	int i, j, key;
	for (i = 1; i < n; i++)
	{
		j = i;
		while (j-1 >= 0 && arr[j-1] > arr[j])
		{
			int temp = arr[j-1];
			arr[j - 1] = arr[j];
			arr[j] = temp;
			j--;
		}
	}
}

4.快排

void quickSort(vector<int>  &root, int low, int high) //high为长度-1
{
	if (low >= high){
		return;
	}
	int pat = root[low];
	int i = low;
	int j = high;
	while (i < j){
		while (i<j && root[j]>pat)
			j--;
		root[i] = root[j];
		while (i < j && root[i] < pat)
			i++;
		root[j] = root[i];
	}
	root[i] = pat;
	quickSort(root, low, i - 1);
	quickSort(root, i + 1, high);
}

5.希尔排序

void shell_sort(vector<int>  &root, int l)
{
	int gap = l / 2;
	while (gap > 0) {
		for (int i = gap; i < l; i++) {
			int j = i;
			while(j >= gap && root[j-gap] > root[j]){
				int temp = root[j];
				root[j] = root[j - gap];
				root[j - gap] = temp;
				j -= gap;
			}
		}
		gap = gap / 2;
	}
}

6.归并排序

void _sort(vector<int> &v, int begin, int end);
void merge_sort(vector<int> &v, int begin, int mid, int end);

void _sort(vector<int>&v, int begin, int end) //end为长度减1
{
	if (begin < end)
	{
		int mid = (begin + end) / 2;
		_sort(v, begin, mid);
		_sort(v, mid + 1, end);
		merge_sort(v, begin, mid, end);
	}
	return;
}

void merge_sort(vector<int>&v, int begin, int mid, int end)//从小到大排列
{

	vector<int>temp;
	int l = begin, m = mid + 1, r = end;
	while (l <= mid && m <= r)
	{
		if (v.at(l) <= v.at(m)) { temp.push_back(v.at(l)); ++l; }
		else { temp.push_back(v.at(m)); ++m; }
	}
	while (l <= mid)
		temp.push_back(v.at(l++));
	while (m <= r)
		temp.push_back(v.at(m++));
	for (int i = 0; i < temp.size(); ++i)
		v.at(i + begin) = temp.at(i);//注意这里一定要从begin开始
	return;
}

二、C++中vector,set,map自定义排序

1.vector

(1)逆序

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	vector<int>obj;

	obj.push_back(1);
	obj.push_back(3);
	obj.push_back(0);

	sort(obj.begin(), obj.end());//从小到大

	cout << "从小到大:" << endl;
	for (int i = 0; i < obj.size(); i++)
	{
		cout << obj[i] << ",";
	}

	cout << "\n" << endl;

	cout << "从大到小:" << endl;
	reverse(obj.begin(), obj.end());//从大到小 
	for (int i = 0; i < obj.size(); i++)
	{
		cout << obj[i] << ",";
	}
	getchar();
	return 0;
}
#include <iostream>
#include <algorithm>
#include <string>
#include <vector> 
typedef long long ll;
using namespace std;
bool cmp(int a, int b) {
	return a > b;
}
int main()
{
	cout << "VECTOR" << endl;
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	sort(v.begin(), v.end(), cmp);
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << endl;
	}
	getchar();
}

2.set

(1)逆序

#include <iostream>
#include <algorithm>
#include <string>
#include <set> 

using namespace std;

int main()
{
	set<int, greater<int> > s;
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	cout << "SET" << endl;
	for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
		cout << *it << endl;
	}
	getchar();
}

3.map

(1)key值,逆序

#include <iostream>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

int main()
{
	cout << "MAP" << endl;
	map<char, int, greater<char> > m;
	m['c'] = 1;
	m['b'] = 2;
	m['a'] = 3;
	for (map<char, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << it->first << " " << it->second << endl;
	}
	getchar();
}

(2)key值,自定义排序

#include<iostream>
#include<algorithm>
#include<string>
#include<map>

using namespace std;


struct CmpByKeyLength {
	bool operator()(const string& k1, const string& k2)const {
		return k1.length() < k2.length();
	}
};

int main()
{
	//1、map这里指定less作为其默认比较函数(对象),就是默认按键值升序排列
	// map<string, int> name_score_map;

	// 2、可以自定义,按照键值升序排列,注意加载 
	// #include <functional> // std::greater
	// map<string, int, greater<string>> name_score_map;

	//3、按照自定义内容进行排序,比如字符串的长度
	map<string, int, CmpByKeyLength> name_score_map;

	name_score_map["LiMin"] = 90;
	name_score_map["ZiLinMi"] = 79;
	name_score_map["BoB"] = 92;
	name_score_map.insert(make_pair("Bing", 99));
	name_score_map.insert(make_pair("Albert", 86));

	map<string, int>::iterator iter;
	for (iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) {
		cout << (*iter).first << endl;
	}
	system("pause");
	return 0;
}

(3)value,排序

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>

using namespace std;

bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
	return a.second < b.second;
}

int main()
{
	//1、map这里指定less作为其默认比较函数(对象),就是默认按键值升序排列
	map<string, int> name_score_map;
	name_score_map["LiMin"] = 90;
	name_score_map["ZiLinMi"] = 79;
	name_score_map["BoB"] = 92;
	name_score_map.insert(make_pair("Bing", 99));
	name_score_map.insert(make_pair("Albert", 86));

	//输出添加的内容
	map<string, int>::iterator iter;
	for (iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) {
		cout << (*iter).first << ":" << (*iter).second << endl;
	}
	cout << endl;

	// 将map中的内容转存到vector中
	vector<pair<string, int>> vec(name_score_map.begin(), name_score_map.end());
	//对线性的vector进行排序
	sort(vec.begin(), vec.end(), cmp);
	for (int i = 0; i < vec.size(); ++i)
		cout << vec[i].first << ":" << vec[i].second << endl;

	system("pause");
	return 0;
}

三、其他

1.C++ 利用set为vector数组去重

#include<set>
#include<vector>
#include<iostream>

using namespace std;

int main()
{
	vector<int> vec;
	vec = { 1, 1, 2, 1};
	set<int> st(vec.begin(), vec.end());
	vec.assign(st.begin(), st.end());
	vector<int>::iterator it;
	for (it = vec.begin(); it != vec.end(); it++)
		cout << *it << endl;
	getchar();
	return 0;
}

2.统计数组(或者向量)中各元素出现的次数

#include <map>
#include <iostream>

using namespace std;

int main(void)
{
	int i;
	int a[] = { 1, 2, 3, 4, 5, 5, 5 };
	map<int, int> m;
	for (i = 0; i < 7; i++)
	{
		if (m.find(a[i]) != m.end()) {
			m[a[i]]++;
		}
		else {
			m.insert(pair<int, int>(a[i], 1));
		}
	}
	map<int,int>::iterator iter;
	for (iter = m.begin(); iter != m.end(); ++iter) {
		cout << (*iter).first << ":" << (*iter).second << endl;
	}
	system("pause");
	return 0;
}

3.在vector中查找元素及其位置


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector <int> vecIntegerArray;
	vecIntegerArray.push_back(5);
	vecIntegerArray.push_back(9);
	vecIntegerArray.push_back(2);
	vecIntegerArray.push_back(3);

	cout << "the contents of the vector are: " << endl;
	vector <int>::iterator iArrayWalker = vecIntegerArray.begin();
	while (iArrayWalker != vecIntegerArray.end())
	{
		cout << *iArrayWalker << endl;
		iArrayWalker++;
	}
	vector <int>::iterator iElement = find(vecIntegerArray.begin(),
		vecIntegerArray.end(), 3);
	if (iElement != vecIntegerArray.end())
	{
		int nPosition = distance(vecIntegerArray.begin(), iElement);
		cout << "Value  " << *iElement;
		cout << "  find in the vector at position: " << nPosition + 1 << endl;
	}
	getchar();
	return 0;
}

4.在string中查找元素及其位置

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string str("abcccabc");
	int num = 0;
	size_t fi = str.find("abc", 0);
	while (fi != str.npos)
	{
		cout << fi << "   ";
		num++;
		fi = str.find("abc", fi + 1);
	}
	if (num == 0)
		cout << "not find!";
	cout << endl;
	getchar();
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值