选择排序,冒泡排序,插入排序


一、选择排序,冒泡排序,插入排序时间复杂度细节的讲解与复杂度分析

估计常数操作的指标

1.1常数操作

例如

  1. 数组的直接取用,所做的操作其实只是做一个偏移量,它就是一个常熟操作
  2. 链表得到i位置的值list.get(i),从左往右遍历找到该位置,则不是常数操作
  3. 同样的还有:加减乘除,位运算
    总结:只要与数据量无关,就是常熟操作,与数据量有关的就不是常数操作。

1.2选择排序

1.2.1算法思路

取一个数组,遍历一遍,找出最小(最大值)讲这个数和第一位进行交换,这样第一位就是最大(小)的了。接着对剩下的遍历找到最值与第二位交换这样不断重复就可以找到最小值了

1.2.2时间复杂度的分析

1.数组索引第一次N,第二次N-1,第三题N-2等等(N+N-1+N-2+……+1)=O(N^2) 2.比较同数组索引O(N^2) 3.交换共N次 所以常数操作可以表示为aN^2+bN+c 忽略最次数小的项(应为当数据量达到一定程度的时候其影响微乎其微) 则为O(N^2)

1.2.3代码实现

public class SelectionSort {

	public static void selectionsort(int [] arr) {
		if( arr == null && arr.length < 2 ) {
			return;
		}
		int l = arr.length;
		for(int i = 0; i < l; i++ ) {
			int min = i ;
			for( int j = i+1 ; j < l; j++ ) {
				min = arr[min] < arr[j] ? min : j;
			}
			swap(arr, i, min);
		}
		
		
	}
	
	public static void swap(int [] arr, int i , int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
		
	}
	
}

当BIG O()相等时

我们必须实际去跑,去允许去测试。应为对与常数的数量与时间并不是完全成正比,因为没一个常数操作的时间不一样。例如位运算与加减乘除运算的时间效率完全不一样

1.3冒泡排序

1.3.1算法思路

取一个数组交换与比较穿插进行,遍历一遍,比较相邻两个数,然后判断是否需要交换,最后确定一个数的位置。然后遍历N遍即可排序完

1.3.2时间复杂度分析

1.显然查找O(N^2)次 2.交换也是O(N^2)次 3.即时间复杂度位O(N^2)

1.3.3代码的实现

代码如下

public class BubbleSort {
	
	
	public static void bubblesort(int[] arr) {
		if(arr == null || arr.length < 2) {
			return ;
		}
		for (int e = arr.length -1 ; e > 0 ; e-- ) {
			for(int i = 0 ; i < e ; i ++ ){
			   if(arr[i]>arr[i+1]) {
				   swap(arr, i ,i+1);
			   }
	
			}
		}
	}
	public static void swap (int [] arr, int i , int j) {
		arr[i]=arr[i]^arr[j];
		arr[j]=arr[i]^arr[j];
		arr[i]=arr[i]^arr[j];
		
	}

}

1.插入排序

将数组分成两部分,一部分已经排好序,另一部分没排好序。不断的从没排好序的集合中选一个出来放到已排好序的数组中。然后不断的交换值。

2.代码

public class insertionSort {
	  public static void insertionSort(int [] arr) {
		  if(arr == null || arr.length < 2) {
			  return ;
		  }
		  for(int i = 1 ; i < arr.length ; i++) {
			  for(int j = i - 1; j >= 0 && arr[j] > arr[j +1]; --j ) {
				  swap(arr , j , j+1);
				  
			  }
		  }
	  }
	  
	  public static void swap(int [] arr , int i , int j ) {
		arr[i]=arr[i]^arr[j];
		arr[j]=arr[i]^arr[j];
		arr[i]=arr[i]^arr[j];  
	  }
    
}

3.时间复杂度

显然从一个集合中取需要N次,然后在另一个集合中交换需要N次。所以时间复杂度为BIG O (N^2)
但是那个只是最差情况,其实最好情况是BIG O(N)
但是这个数值对于算法学习没有用,所以一般不用
还有两个不常用的符号
一个平均时间复杂程度
一个是最简时间复杂程度
只不过对于算法学习没有用就不做多说

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

醉卧考场君莫笑

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值