在写这篇文章之前,先点一根红烛默哀我腾讯挂掉的笔试/(ㄒoㄒ)/~~小女子尽力了,真的真的尽力了/(ㄒoㄒ)/~~奈何缘浅,就此别过吧ヾ( ̄▽ ̄)Bye~Bye~
在这里先提前说明一下,在下面讲解中,会涉及到时间复杂度和空间复杂度的计算,那么先来说一下怎样计算时间复杂度和空间复杂度?
按照书上所说,时间复杂度的计算方法如下:
1.计算出基本操作的执行次数T(n);
2.计算出T(n)的数量级,令f(n)=T(n)的数量级;
3.用大O来表示时间复杂度,当n趋近于无穷大时,如果lim(T(n)/f(n))的值不等于0,则T(n)=O(f(n)),称为算法的时间复杂度。
吧啦吧啦吧啦~~~是不是很复杂的感觉,瞬间感到了深深的恶意吗?那我们简化一下,用学渣的思想去计算:
1.找到执行次数最多的语句;
2.计算语句中执行次数的数量级;
3.OK~那就是时间复杂度了,不要怀疑~~~
言回正传啦,咳咳,说排序了。
排序分为内部排序和外部排序,我们接触最多的也就是内部排序,所谓内部就是数据记录在内存中,八大排序也就是典型的内部排序。
1.直接插入排序
基本思想:
假设我们存在一个待排元素数组R[0...n-1],在排序过程中,我们将R分成两个子序区,R[0..i-1]称为有序区,R[1..n-1]称为无序区,然后我们再从无序区开头位置R[i]开始扫描,每一次在有序区中只增加一个元素到合适的位置。
C++代码:
void InsertSort(RecType R[],int n){
int i,j;
RecType temp;
for(i=1;i<n;i++){
temp = R[i];
j=i-1; //从右向左,在有序区中找到插入的位置
while(j>=0 && temp.key<R[j].key){
R[j+1]=R[j]; //将关键字大于R[i]的元素后移
j--;
}
R[j+1]=temp;
}
}
2.折半插入排序
基本思想:
类似于直接插入,但是我们可以在有序区找插入位置的时候,采用折半查找法,再通过移动元素进行插入。我们可以把R[0..n-1]设为R[low..high],找到插入位置为R[high+1],再将R[high+1..i-1]中的元素后移一个位置,并置R[high+1]=R[i]。
C++代码:
void InsertSort(RecType R[],int n){
int i,j,low,high,mid;
RecType tmp;
for(i=1;i<n;i++){