动图表示:

冒泡排序:代码+优化 优化就是加一个标志位,如果某一次循环有几次没有交换过,所以加入一个标志位。

package com.leo.sort;

import java.util.Arrays;

public class BubbleSort {
	public static void main(String[] args) {
		int arr[] = {3,9,-1,10,-2};
		bubbleSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void bubbleSort(int[] arr) {
		// 冒泡排序 的时间复杂度 O(n^2), 自己写出
		int temp = 0; // 临时变量
		boolean flag = false; // 标识变量,表示是否进行过交换
		for (int i = 0; i < arr.length - 1; i++) {

			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 如果前面的数比后面的数大,则交换
				if (arr[j] > arr[j + 1]) {
					flag = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			if (!flag) { // 在一趟排序中,一次交换都没有发生过
				break;
			} else {
				flag = false; // 重置flag!!!, 进行下次判断
			}
		}
	}
 
}

数组当然是可以自定义什么的还可以算一下时间效率神马的。

 

 

文字版本:

排序算法

排序也称排序算法(SortAlgorithm),将 一组数据,依 指定的顺序进行 排列的过程。

排序的分类:

内部排序和外部排序,外部排序就是因为数据量过大,无法全部加载到内存中内存和外部存储结合进行排序,内部排序包括如下:

插入排序(直接排序+希尔排序)

选择排序(简单选择+堆排序)

交换排序(冒泡排序+快速排序)

归并排序、

基数排序。

算法的时间复杂度:

度量一个程序(算法)执行时间性能,因为事后统计时间要求和资源浪费就用事前估算法,就要算时间复杂度!so。。。来研究时间复杂度。

时间频度:就是一个算法中语句的执行次数 T(n)

时间复杂度:算法中的基本操作语句的重复执行次数是 n 的某个函数,用 T(n)表示,若有某个辅助函数 f(n),使得当 n 趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n)是 T(n)的同数量级函数。记作 T(n)= O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。

3) 计算时间复杂度的方法:

去掉常数项、去掉低阶项、去掉系数!

1) 常数阶 O(1)

2) 对数阶 O(log2n) 单纯while循环

3) 线性阶 O(n) 单纯for循环

4) 线性对数阶 O(nlog2n) for循环里面嵌套while循环

5) 平方阶 O(n^2) 双重for循环

6) 立方阶 O(n^3) 三层for循环

7) k 次方阶 O(n^k) K层for循环

8) 指数阶 O(2^n) 尽量避免 if else?。。。待研究

时间复杂度由小到大:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n) ,随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低对数阶O(log2n), 线性对数阶O(nlog2n),除了常数阶以外,该种效率最高

空间复杂度:(Space Complexity)为该算法所耗费的存储空间,它也是 问题规模 n 的函数。时间复杂度才是算法分析时看重的。 因为程序执行的速度是用户感官直接的体验。一些缓存产品(redis, memcache)和算法(基数排序)本质就是用空间换时间。

冒泡排序:

Bubble Sort: 从前往后依次比较 相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

1,大的循环(数组-1)次

2,每个大循环里面的次数在逐渐减小

3,某一次大循环中,没有发生一次交换,提前结束这个大循环(优化)