如何分析一个“排序算法”?
排序算法的执行效率
最好最坏平均情况时间复杂度
时间复杂度的系数、常数、低阶
比较次数和交换次数
排序算法的内存消耗
排序算法的稳定性
冒泡排序
原理:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。
代码实现:
publicvoidbubbleSort(int[] arr,intn){ if(n<=0 ){ return; } for(inti=0; i<n; ++i){ booleanflag=false; for(intj=0;j<n-i-1;++j){ if(arr[j+1] <arr[j]){ inttemp=arr[j]; arr[j] =arr[j+1]; arr[j+1] =arr[j]; flag=true; } } if(!flag) break; } }
稳定性分析:稳定
复杂度分析:
插入排序
原理:将一组数据进行分类,一类是已有序数据,另一类是未排序数据,每次循环将未进入到有序数据得数据中找到一个,并在有序数据中找到合适位置,并将数据进行放入有序集合内。整理扑克牌的思想。
对于近乎有序的操作,效率更高。
代码实现:最坏复杂度O(n^2) 最好复杂度O(n) 平均复杂度O(n^2)
publicstaticvoidinsertSort(Comparable[] arr){ intn=arr.length; for (inti=1; i<n; i++){ //寻找元素arr[i]合适得插入位置// 优化方式Objectobj=arr[i]; intj ; for (j=i; j>0&&arr[j-1].compareTo(obj) >0 ; j--) { arr[j] =arr[j-1]; } arr[j] = (Comparable) obj; } }
稳定性分析:稳定
复杂度分析:最坏复杂度O(n^2) 最好复杂度O(n) 平均复杂度O(n^2)
选择排序
原理:一个需要排序得数组元素有n个,每一次循环时判断目标元素与组内其他元素大小判断,小或者大,取出之后,记录数组内下表,并在一次循环后将满足条件得数据进行交换位置。完成n此循环后实现排序。首先找到第一名的位置,让第一名的位置与第一的数据进行交换,保持前面的数据有序,在后面的数据找到第二个位置的数据。
其实就是,保证前面数据的有序,在后面找到满足条件的一个值,放到前面的数据。
代码实现:
publicvoidselectionSort(int[] arr,intn){ if(n<=0){ return; } for(inti=0; i<n; i++){ intminIndex=i; for(intj=i+1,j<n; j++){ if(arr[j] <arr[minIndex]){ minIndex=j; } } inttemp=arr[i]; arr[i] =arr[minIndex]; arr[minIndex] =temp; } }
稳定性分析:该算法为不稳定算法,元素间顺序时会发生变化得再排序过程中
复杂度分析:最坏复杂度 最好复杂度 平均复杂度均为O(n^2)
大家加油