c++中的部分排序

写的目的,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


主要写作目的:再次声明一次嘛,就是复习一下自己快忘得差不多的知识(这是最主要的哈),然后呢,随便帮助一下自己能帮助到的,自己就已经很开心了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农~木子李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值