目录
一、排序算法
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;
}