写的目的,1复习快遗忘的知识点,2希望可以帮助和我一样的菜鸟
#ifndef CSDN_TOOL_H_
#define CSDN_TOOL_H_
#include<time.h>
#include<windows.h>
#include<map>
//std的命名空间
using namespace std;
///CreateListNumBer(A,B)创建表的成员 A 表,B表的成员个数
/随机数种子
std::map<int, int> CreateListNumBer(std::map<int ,int>Map_,int num)
{
int key = 0;
//num -= num;
while (num--)
{
//创建随机数并存入到指定的表内
Map_[key++] = rand();
//cout << Map_ [key++]<< " ";
}
return Map_;
}
//表的输出函数
void Print(std::map<int, int>Map_)
{
int key = 0;
while (Map_[key])
{
cout << Map_[key++]<<" ";
}
cout << "\n...................\n";
}
//
// Sort_Maopao(std::map<int, int>Map_,int Rules = 1)冒泡排序参数1为表,
//参数2二为规则(小说一下这个其实规则可以从外部传一个函数指针的但是想了一下,每一个人写的规则函数不一样,很容易造成程序异常
//所以,我这就规定传入的规则为int类型的参数 ,规定 参数为1,该表的值默认排序为从小到大,其他值默认为从大到小,下面同样如此理解 )
std::map<int, int> Sort_Maopao(std::map<int, int>Map_,int Rules = 1){int size = Map_.size();// cout << size << endl;for (int i = size - 1; i > 1; --i){for (int j = 0; j<i-1; ++j){if (Rules == 1){if (Map_[j]>=Map_[i]){//通过位运算来交换两个常量的值Map_[j] = Map_[i] ^ Map_[j];Map_[i] = Map_[i] ^ Map_[j];Map_[j] = Map_[j] ^ Map_[i];}}else{if (Map_[j]<=Map_[i]){//通过位运算来交换两个常量的值Map_[j] = Map_[i] ^ Map_[j];Map_[i] = Map_[i] ^ Map_[j];Map_[j] = Map_[j] ^ Map_[i];}}}}return Map_;}std::map<int, int> Sort_XuanZe(std::map<int, int>Map_, int Rules){int size = Map_.size();//cout << size << endl;for (int i = 0; i < size - 1; ++i){int A = i;for (int j = i+1; j < size; ++j){if (Rules == 1){if (Map_[j] >= Map_[A])A = j;}else{if (Map_[j] <= Map_[A]){A = j;}}}if (i != A){//通过位运算来交换两个常量的值Map_[A] = Map_[i] ^ Map_[A];Map_[i] = Map_[i] ^ Map_[A];Map_[A] = Map_[A] ^ Map_[i];}}return Map_;}std::map<int, int> Sort_KuaiPai(std::map<int, int>Map_, int Rules, int begin, int end){if (begin < end){int k = begin;for (int i = begin + 1; i < end; ++i){if (Rules == 1){if (Map_[i] <= Map_[k]){k++;if (k != i){Map_[k] = Map_[i] ^ Map_[k];Map_[k] = Map_[i] ^ Map_[k];Map_[i] = Map_[k] ^ Map_[i];}}}else{if (Map_[i] >= Map_[k]){k++;if (k != i){Map_[k] = Map_[i] ^ Map_[k];Map_[k] = Map_[i] ^ Map_[k];Map_[i] = Map_[k] ^ Map_[i];}}}}if (k != begin){Map_[k] = Map_[begin] ^ Map_[k];Map_[k] = Map_[begin] ^ Map_[k];Map_[begin] = Map_[k] ^ Map_[begin];}Sort_KuaiPai(Map_,Rules, begin, k - 1);Sort_KuaiPai(Map_, Rules, k+1, end);}return Map_;}void sort_quick(int* p, int b, int e){if (b < e){int pos = b;for (int i = b + 1; i <= e; ++i){if (p[i] < p[b]){pos += 1;if (pos != i){int t = p[i];p[i] = p[pos];p[pos] = t;}}}if (pos != b){int t = p[b];p[b] = p[pos];p[pos] = t;}sort_quick(p, b, pos - 1);sort_quick(p, pos + 1, e);}}std::map<int, int>Sort_ChaPai(std::map<int, int>Map_, int Rules){int b = 0;int e = Map_.size();for (int i = b + 1; i < e; ++i){int j;for (j = b; j < i; ++j){if (Rules == 1){if (Map_[i] <= Map_[j]){break;}}else{if (Map_[i] >= Map_[j]){break;}}}if (j < i){int T = Map_[i];for (int k =0; k < i-j; ++k){Map_[i - k] = Map_[i - k - 1];}Map_[j] = T;}}return Map_;}
//这里我要说明一点,这个快排我觉得逻辑上没有问题,但是测试结果还是和我预期的·不一样,so 这个快排我写了3种方法,
//其中有一种还借鉴了网上的,但是测试·结果还是不对,so希望大家借鉴的同时,帮忙改正一下,然后通知我一下,谢谢各位大佬
void quickSort(int* A, int first, int last) { //数组A,first是第一个元素下标,last是最后一个元素下标
if (last <= first) //到了长度小于1这种情况已经是有序列了
return;
int pivot = A[first];
int left = first + 1; //left等于第二个元素
int right = last;
int temp;
while (left <= right) {
while (A[right]>pivot&&right >= left)//找到一个比first小的,但必须保证left值小于等于right值
right--;
while (A[left]<pivot&&left <= right) //找到一个比first大的,但得保证left值小于等于right值
left++;
if (left >= right) //说明已经是相对有序序列,无需交换
break;
temp = A[left]; //交换位置
A[left] = A[right];
A[right] = temp;
left++, right--; //相应的进一位
}
A[first] = A[right]; //因为right一定是停在从右到左第一个小于first的数上,交换之后,
//依然能保证first值左边的比first小,右边的比first大
A[right] = pivot;
quickSort(A, first, right - 1); //左半部分
quickSort(A, left, last); //右半部分
}
#endif
主要写作目的:再次声明一次嘛,就是复习一下自己快忘得差不多的知识(这是最主要的哈),然后呢,随便帮助一下自己能帮助到的,自己就已经很开心了