算法记录-排序算法-冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

1.算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2. 动图演示

3.代码实现(c++)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


//bubble_Sort 冒泡排序
template<typename T>  //提供模板 
void Mysort01(T arr[],int len) {    //冒泡排序 函数
	if (arr == nullptr || len < 0 || len == 0) {  //如果指针为空或者数组长度小于等于0的话retutrn
		return;                     //tips: c++11引用的nullptr,和NULL本质上有些差别,不过作用用法上无差别
	}

	
	for (int i = 0; i < len; i++) {     //这一层的for循环的作用为控制次数.即{9,8,7,6,5,4,}时,内层for循环交换过后,
								//为{8,7,6,5,4,9},i+1,继续循环。

		for (int j = 0; j < len - 1 - i; j++) {    //这一层的for循环控制两数交换,防止越界所以len-1,
										   //已经交换过排完序的数字不需要在动了,所以len-1-i
			if (arr[j] > arr[j + 1]) {   //交换两个数字
				swap(arr[j], arr[j + 1]);
				
			}
		}

		
	}


}

int main() {
	int arr[] = { 9,8,7,6,5,4 };      //测试数组
	int len = (int)sizeof(arr) / sizeof(*arr);  //数组长度
	Mysort01(arr, len);

	for (int i = 0; i < len; i++) {
		cout << arr[i] << " ";
	}



	system("pause");
	return 0;

}

代码优化:

设置一个flag,如果交换过后已经排序完成则无需再进行循环排序

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


//bubble_Sort 冒泡排序
template<typename T>  
void Mysort01(T arr[],int len) {    
	if (arr == nullptr || len < 0 || len == 0) {  
		return;                    
	}

	bool flag;  //标志
	for (int i = 0; i < len; i++) {     
								
		flag = false; //设置为false;
		for (int j = 0; j < len - 1 - i; j++) {    
										 
			if (arr[j] > arr[j + 1]) {   
				swap(arr[j], arr[j + 1]);
				flag = true;  //交换过后为true
			}
		}

		if (!flag) break;//若没有交换则退出循环  if(flag!=true)
	}


}

int main() {
	int arr[] = { 9,8,7,6,5,4 };      
	int len = (int)sizeof(arr) / sizeof(*arr); 
	Mysort01(arr, len);

	for (int i = 0; i < len; i++) {
		cout << arr[i] << " ";
	}



	system("pause");
	return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值