冒泡法排序c语言函数模板,使用模板技术的冒泡排序
#include
#include
#include
using namespace std;
template
bool compare(Elem lhs, Elem rhs){
if (lhs<=rhs) return false;
else return true;
}
//template
//typedef bool(*comparefunc)(Elem lhs, Elem rhs); 不能利用模板来重定义类型。
template
void bubblesort(Elem* arr, int n, bool(*func)(Elem lhs, Elem rhs) = compare)
//下面这个语句中相当于对函数指针起了两个名字,应该是上面这样。
//实际上函数指针的类型表示是bool (*)(Elem ,Elem),func已经是函数指针名了。
//void bubblesort(Elem* arr, int n, bool(*func)(Elem lhs, Elem rhs)
comparefunc= compare)
{
Elem temp;
for (int i = 0; i < n-1; i++){ //一要保证数组不越界,二要保证保证对所有数据进行排序。
for (int j = i + 1; j < n ; j++){
if (arr[j] < arr[i]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
class Credit{
public:
Credit():value(0){ //利用初始化参数列表来初始化字段。
}
Credit(int value){
this->value = value;
}
int getValue(){
return this->value;
}
void setValue(int value){ //setValue表示的是一个赋值过程,并不要求将结果返回。所以返回值类型为void类型。
this->value = value;
}
bool operator
return (this->value < other.getValue()) ? true : false;
}
bool operator==(Credit& other){
return (this->value == other.getValue()) ? true : false;
}
bool operator<=(Credit& other){
//在进行运算符重载时,定义的重载函数的返回值等信息要与原运算符的本质保持一致,这里应该返回的是布尔类型。
//下面的语句提示Credit没有value成员。是因为在类中只能访问当前对象(用this指针引用的对象的private数据成员,对于与当前类同类型的其他实例在本类的成员函数中无法直接访问其private数据成员。所以说在当前类本身中可以访问类的private数据成员,只是针对类的当前实例,而不是该类型的所有实例。 //return (this->value <=other.value) ? true : false;
return (this->value <= other.getValue()) ? true : false; //也可以写成 return (this
//当类本身的比较复杂时,这样写可充分利用已有代码,并且当其他运算符要进行变动时,这里一般不需要改动。
}
private:
int value;
};
int main(){
int arr[10] = { 3, 5, 7, 11, 78, 34, 67, 45, 23, 4 };
bubblesort(arr, 10);
for (int num : arr){
cout << num << " ";
}
Credit creditSet[23];
srand(time(NULL)); //time是个内联函数,用static修饰,参数和返回值都是一个64位的整数,但是srand的参数是unsigned int。
for (int i = 0; i < 23; i++){ //注意这里的23可不能用sizeof(creditSet/sizeof(Credit))来表示,因为有内存对齐的影响。
creditSet[i].setValue(rand() % 100);
}
cout << endl;
bubblesort(creditSet, 23);
for (int i = 0; i < 23; i++){ //注意这里的23可不能用sizeof(creditSet/sizeof(Credit))来表示,因为有内存对齐的影响。
cout<
}
return 0;
}
一些参考资料
C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。(注:是否包括区间端点????)
(2) 如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:
例如:随机生成10个0~100的数:
#include
#include
#define random(x) (rand()%x)void main()
{
for(int x=0;x<10;x++)
printf("%d/n",random(100));
}
(3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。
srand()函数定义 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值来当做seed如果你用time(0)的话,要加入头文件#include
在stdlib.h 中这两个函数的原型是:
int rand();
void srand (unsigned int);
扩充:
x = rand()%11; /*产生1~10之间的随机整数*/
y = rand()%51 - 25; /*产生-25 ~ 25之间的随机整数*/
注:根据要求的两个数据之间的差值确定rand函数后面取余多少。比如产生【a,b]的数,则取余的数是b-a,若a=-7,b=-2,取余后一共有b-a+1种值,则取余的数为b-a+1,结果在(0,b-a)之间,共b-a+1种值。
取余后的值中0对应区间中的小值,所以delta=a-0
z = ((double)rand()/RAND_MAX)*(b-a) + a;/*产生区间[a,b]上的随机数*/
冒泡法排序c语言函数模板,使用模板技术的冒泡排序相关推荐
- PTA 基础编程题目集 7-27 冒泡法排序 C语言
PTA 基础编程题目集 7-27 冒泡法排序 C语言 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一 ...
- C语言 数组排序 – 冒泡法排序 - C语言零基础入门教程
目录 一.简介 二.数组冒泡法排序原理 三.数组冒泡法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习, ...
- 冒泡法排序c语言算法步骤,冒泡排序 - 数据结构与算法教程 - C语言网
1.复杂度与稳定性 算法时间复杂度 最坏情况:O(n^2) 最好情况:O(n) 平均情况:O(n^2) 空间复杂度:S(n)=O(1) 稳定性:稳定排序 2.过程介绍(以顺序为例) 1.从第一个元素开 ...
- PTA-7-27 冒泡法排序-C语言 (20分)
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的元素.然后用同样的方法对前N−1个元 ...
- pta.7-27冒泡法排序C语言
代码↓ 判断点↓
- 冒泡法排序c语言程序指针,C语言_冒泡排序(指针)
一纬数组 #include "stdio.h" void main() { int i,a[10]={9,4,6,2,7,0,1,5,3,8}; sort(a+1,10); for ...
- C语言算法:冒泡法排序
C语言 冒泡法排序 要点:如果要对 N 个数 进行冒泡排序,那么要进行 N-1 趟 比较,在第1 趟比较中 要 进行 N-1 次两两 比较,(C语言中的数值比较 每次只能在 两个数之间),推而广之,在 ...
- C语言 数组排序 – 快速法排序 - C语言零基础入门教程
目录 一.简介 二.数组快速法排序原理 三.数组快速法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习, ...
- C语言 数组排序 – 选择法排序 - C语言零基础入门教程
目录 一.简介 二.数组选择法排序原理 三.数组选择法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习, ...
最新文章
- python之⾯向对象-继承
- 开发你的第一个 Android 应用
- 老广: KVM虚拟化学习笔记
- 函数 —— fork()分叉函数
- Apache Hadoop版本详解
- 数据结构实验之链表九:双向链表
- 本地连接出来的很慢解决方法
- go语言条件语句 if else
- JS与Object-C交互补充
- JavaScript中注册时间处理程序的方式
- 密码键盘介绍三:数据加解密
- JavaScript高级程序设计 第4版
- 数据库锁 与 事务隔离级别
- QQ空间g_tk算法的JS脚本的获取和分析
- SQL经典面试题--留存率问题
- Guessing the Greatest (hard version)-(交互+二分+思维)
- Paste Image插件初始化设置:修改图片保存路径、自动插入图片描述信息
- Python实现自定义竖线的线型
- 一个汉字占几个字节的问题
- P1365 WJMZBMR打osu! / Easy (期望dp)
热门文章
- docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...
- QT的安装以及测试是否成功
- 鸿蒙系统适配机型_华为鸿蒙 OS 适配机型曝光,除了 Mate 40 还有这几款!
- mysql限制类别_MySQL限制每个类别的结果
- makex机器人程序_收藏!MakeX 机器人挑战赛2018全球最新赛程和赛事手册公布
- 微信小程序 筛选侧边栏 全选与反全选
- mfc140dll 丢失 微软常用运行库_微软常用运行库合集 2020.9月(32amp;64位)
- Android开发之最简单的布局点击Tab和Fragment切换源码(特别适合初学者)
- 200(强缓存)和304(协商缓存)的区别
- 《迷人的8051单片机》---- 1.2小元器件有大智慧