首页 > 编程语言 >算法回顾之一:冒泡排序

算法回顾之一:冒泡排序

时间:2023-09-14 14:35:14浏览次数:49  
标签:回顾 int 元素 冒泡排序 算法 升序 array 排序


数据结构与算法是计算机本科相关专业学生的必修课,我当年自然也是学过的,而且印象考试成绩还不错。

不过近期写了一个冒泡排序算法(不使用类库实现),竟然出现了Bug,实在惭愧。

仔细想想工作这几年一直都是使用Java集合框架和类库,因此感觉还是有必要再重温一下。

-----------------------------------------------------------

冒泡排序

基本原理:

依次比较相邻的2个元素,把小数放在前面,把大数放在后面。遍历数组的每一个元素后,最大的数放在了最后。

再次从头比较相邻2个元素,把小数放在前面,把大数放在后面。直到比较到倒数第二个数(倒数第一个数已经是最大的了)。

依此类推,直到将数组中所有元素都排序一遍。

程序实现:

 

public static void bubbleSort(){
	    int[] array=new int[]{9,8,7,6,5,4,3,2,1};
	    boolean noSwapFlag=true;//未发生交换标识
	    int temp=0;//临时变量,用于排序时的数据交换.
		for (int i=0;i<array.length-1;i++) {//数组中的已排序元素.
			noSwapFlag=true;//每轮排序前重置未交换标识
			for (int j=0;j<array.length-i-1;j++){//每一轮排序需要遍历的元素个数.
				//升序排序:如果前面的元素大于后面的元素,交换位置(小于为降序).
				if (array[j] > array[j+1]){
					temp=array[j];
					array[j]=array[j+1];
					array[j+1]=temp;
					//如果有交换时,未发生交换的标识置为false.
					noSwapFlag=false;
				}
			}
			System.out.println("Sort"+i+":"+Arrays.toString(array));
			if(noSwapFlag){//该轮排序中没有任何元素发生交换,代表已达到所需顺序.
				System.out.println("No swap!");
				break;
			}
		}
		System.out.println("Sort Result:"+Arrays.toString(array));
	}

 

性能分析:

1、如果目标序列为升序,而数组本身也是升序,那么只需要1次排序即可排出。排序次数为n-1次。

2、如果目标序列为升序,而数组全部元素逆序,那么需要n*(n-1)/2次比较和移动。

因此,冒泡排序的总时间复杂度为O(n^2).

 

空间复杂度:1。

稳定性:稳定的排序。

标签:回顾,int,元素,冒泡排序,算法,升序,array,排序
From: https://blog.51cto.com/u_6978506/7470117

相关文章

  • 算法回顾之二:直接插入排序
    算法回顾系列第二篇:直接插入排序算法-------------------------------------------直接插入排序基本原理:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含一个元素,无序表中包含有n-1个元素。排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当......
  • C#(4):语言基本元素、类型、变量、方法、算法
     穿插算法和数据结构var类型可以根据复制自动推断变量属性    应为get或set访问器:方法名没加括号变量和方法(循环,递归)usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceClassMethodExample{classProgra......
  • 设计模式回顾之一:单例模式(Java的4种实现)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------作为一个程序员,我并不知道"茴"字有4种写法。但是,我知道单例有4种写法。单例模式目的:保证一个类仅有一个实例,并提供一个访问它的全局访......
  • 设计模式回顾之二:外观/门面模式(Facade)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------外观/门面模式(Facade)希望简化原有系统的使用方式,需要定义自己的接口。Facade模式简化了对所需子系统的使用过程,但是由于Facade并不......
  • 算法回顾之三:二分查找
    算法回顾系列第三篇:二分查找算法------------------------------------------------二分查找算法 基本原理:首先,假设表中元素是按升序排列.将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功.否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • 逆向使用的公共加密解密的方法与算法
    python的AES加密解密方法-ECB模式fromCrypto.CipherimportAESimportbase64fromCrypto.Util.Paddingimportunpad,paddefdecrypt_aes(ciphertext,key):ciphertext=base64.b64decode(ciphertext)#使用base64解码密文cipher......
  • 代码随想录算法训练营第8天| ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 0
    344.反转字符串mydemo--(一次就过)--(成功)classSolution{public:voidreverseString(vector<char>&s){intlen=s.size();chartmp;inti=0;intj=len-1;while(i<j){tmp=s[i];......
  • 设计模式回顾之十二:迭代器模式(Iterator)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。适用于:访问一个聚合对象的内容而......
  • 设计模式回顾之十:工厂方法模式(FactoryMethod)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------工厂方法模式(FactoryMethod)定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。......