数据结构复习 algorithm alaysis 2
空间复杂度,时间复杂度。
空间复杂度包括:指令,变量,参数等,还包括运行时需要储存的空间大小。
时间复杂度:编译时间+运行时间。
方法一:计算重要的操作执行的次数。
2.一般来说平均复杂度不怎么好计算,可以选择计算最差和最优的。
排序算法:
1.选择排序: 每次从n..n-1..n-2..中选出最小的或者最大的,放在其中。
public static void SelectionSort( int [ ] a, int n) {//sort the n number in a[0:n-1]. for(int size=n; size>1; size--) { int j=Max(a,size); swap(a[j],a[size-1]); } }
Max中会有比较:时间复杂度:
n-1+n-2+.....3+2+1=(n-1)*n/2
2.冒泡排序:
public static void Bubble(int []a){ int n=a.length(); for(int i=0;i<n-2;i++){ for(int j=i+1;j<n-1;j++){ if(a[i]>a[j]){ swap(a[i],a[j]); } } } }
时间复杂度也是(n-1)*n/2.
3.rank排序
记录比当前元素小的元素有多少个,或比当前大的元素有多少个。
public static void Rank( int [ ] a, int n, int [ ] r) {//Rank the n elements a[0:n-1] for(int i=0;i<n;i++) r[i]=0; for(int i=1;i<n;i++) for(int j=0;j<i;j++) if(a[j]<=a[i]) r[i]++; else r[j]++; }
////// public static void Rearrange( int [ ]a, int n, int[ ] r) {//In-place rearrangement into sorted order for(int i=0;i<n;i++) while(r[i]!=i) { int t=r[i]; swap(a[i],a[t]); swap(r[i],r[t]); } }
(n-1)*n/2
4.插入排序
依次决定元素插入的位置。
public static void InsertionSort( int [ ]a, int n) { for(int i=0;i<n;i++) { //insert a[i] into a[0:n-1] int t=a[i]; int j; for(j=i-1; j>=0&&t<a[j]; j--) a[j+1]=a[j]; a[j+1]=t; } }
最好的情况是:已经排序好 n-1 移动的数目是2*(n-1).
最坏的情况(n-1)*n/2 移动的数目是(1+2)+(2+2)+....+(n-2+2)+(n-1+2)=(n^2+3n-4)/2
方法2:步数计算 计算每一个语句执行的次数。
渐进表示。