桶排序、数组知识强化、VS2019快捷键、类

快捷键:

Ctrl + F5:查找

Ctrl + K和Ctrl + C:注释代码

Ctrl + K和Ctrl + U:取消注释

shift+方向键:向各个方向选中

双Tab:自动补全代码

Ctrl + 左右键:移动整个单词

home:一行的开头。 -- Ctrl + home:文档开头

end:一行的结尾。 -- Ctrl + end:文档结尾

Page Up:上翻一页

Page Down:下翻一页

Ctrl + K和Ctrl + D: 格式化整个代码

Ctrl + K和Ctrl + F:格式化选中的代码

桶排序:

#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
#define NUMMAX 10000
#define BUCKETMAX 10

typedef int Type;
//生成10000个数据
void test(Type arrNum[], int arrNumMax)
{
	for (int i = 0; i < arrNumMax; i++)
	{
		int num = rand() % 1000;
		arrNum[i] = num;
	}
}
//打印数据
void showArray(Type arrNum[], int arrNumMax)
{
	for (int i = 0; i < arrNumMax; i++)
	{
		cout << arrNum[i] << "\t";
	}
}
//桶子的大小
void newBucket(Type* arrBucketAddr[], int arrBucketMax, int arrNumMax)
{
	int i = 0;
	for (i = 0; i < arrBucketMax; i++)
	{
		arrBucketAddr[i] = new Type[arrNumMax];
	}
}
//把数据倒入桶子内
void sort_Num_TO_Bucket(Type arrNum[], int arrNumMax, Type* arrBucketAddr[],
	int arrBucketAddrMax, int BucketFlag[], int way, int now_Digits)
{
	int i = 0;
	int j = 0;
	if (way == 1)
	{
		for (i = 0; i < arrNumMax; i++)
		{
			for (j = 0; j < arrBucketAddrMax; j++)
			{
				//pow:对应的数据类型为double,这里需要强制转化为int
				//按照个位来进行分类
				if (arrNum[i] / (int)pow(10, now_Digits) % 10 == j)
				{
					//*arrBucketAddr为桶子的地址,**arrBucketAddr为桶子的内存空间
					*(arrBucketAddr[j] + BucketFlag[j]) = arrNum[i];
					BucketFlag[j]++;
					break;
				}
			}
		}
	}
}

//把桶内的数据倒出来
void sort_Bucket_To_Num(Type arrNum[], int arrNumMax, Type* arrBucketAddr[], int arrBucketAddrMax, int BucketFlag[])
{
	int i, j, k;
	for (i = 0; i < arrNumMax;)
	{
		for (j = 0; j < arrBucketAddrMax; j++)
		{
			for (k = 0; k < BucketFlag[j]; k++)
			{
				arrNum[i] = *(arrBucketAddr[j] + k);
				i++;
			}
			BucketFlag[j] = 0;
		}
	}
}
//找到最大值
Type findMax(Type arrNum[], int arrNumMax)
{
	int i = 0;
	Type max = arrNum[0];
	for (i = 0; i < arrNumMax; i++)
	{
		if (arrNum[i] > max)
		{
			max = arrNum[i];
		}
	}
	return max;
}
//计算位数
int calc_Digits(Type num) //计算数据的位数
{
	int i = 0;
	if (num == 0)
		return 1;
	for (i = 0; num != 0; num /= 10, i++);
	return i;
}

//桶排序
void bucketSort(Type arrNum[], int arrNumMax, int way)
{
	//在堆区开辟桶的空间,arrBucket存储桶的地址
	Type** arrBucketAddr = new Type * [BUCKETMAX];
	//每个桶存储的数据数量
	int BucketFlag[BUCKETMAX] = { 0 };

	newBucket(arrBucketAddr, BUCKETMAX, arrNumMax);
	Type max = findMax(arrNum, arrNumMax);
	int maxDigits = calc_Digits(max);

	for (int now_Digits = 0; now_Digits < maxDigits; now_Digits++)
	{
		//第一次先按照个位将数据放入桶子内,然后依次倒出
		//第二次按照十位将数据放入桶子内,然后依次从0号桶子开始倒
		//第三次按照百位将数据放入桶子内,倒出数据,数据排列完毕
		sort_Num_TO_Bucket(arrNum, arrNumMax, arrBucketAddr, BUCKETMAX, BucketFlag, way, now_Digits);
		sort_Bucket_To_Num(arrNum, arrNumMax, arrBucketAddr, BUCKETMAX, BucketFlag);
	}
	delete arrBucketAddr;
}

int main()
{
	srand((unsigned int)time(NULL));

	//arrNum用于存放要排序的数据
	Type* arrNum = new Type[NUMMAX];
	test(arrNum, NUMMAX);
	bucketSort(arrNum, NUMMAX, 1);
	showArray(arrNum, NUMMAX);

	delete arrNum;
	return EXIT_SUCCESS;
}

桶排序的关键:有几位数,就重复几次。一次:把数据先倒入桶内,在倒出桶,表示一次。

先按个位进行倒入倒出,再十位,再百位,以此类推。

数组强化知识:

arr[0]+1,在for循环中,输出结果都是0,因为arr数组{0}只有一个0,为全局变量,在循环一次完毕后,输出的是全局变量中的数值

 

将arr[0]+1改成arr[0]++,意思就是arr数组中第一个数做自增。

类:

在C++中,类和结构体唯一的区别就是默认的访问权限不同

类的默认权限:私有权限(类内可以访问,类外不可以访问)

结构体默认权限:公共权限(类内可以访问,类外也可以访问)

#include<iostream>
using namespace std;

/*
public:公共权限	类内可以访问 类外也可以访问
protected:保护权限	类内可以访问 类外不可以访问
private:私有权限	类内可以访问 类外不可以访问
*/

int main()
{
    /*语法:
	class Student
    {
        权限类型:
            行为(即函数体)
            属性(类的属性值)
    };

    */
	return EXIT_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jack_wenbai

你的点赞就是最大的帮助了

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

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

打赏作者

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

抵扣说明:

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

余额充值