数据结构复习 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:步数计算 计算每一个语句执行的次数。

渐进表示。

 

 

 

posted @ 2016-05-19 15:17  bounce  阅读(330)  评论(0编辑  收藏  举报