习题2.1.2
#include <iostream> using namespace std; void insectionSort(int a[],int len) { for(int i=1;i<len;i++) { int j=i-1; int t=a[i]; while(t>a[j]&&j>=0)//用t来比较而不是用a[i] 因为a[i]会变 { a[j+1]=a[j]; j--; } a[j+1]=t; } } int main() { int a[7]={41,25,89,74,32,14,258}; insectionSort(a,7); for(int i=0;i<7;i++) { cout<<a[i]<<" "; } return 0; }
2.1.4
#include <iostream> using namespace std; int* add(int a[],int b[],int n) { int* c=new int(n+1); int t; for(int i=n-1;i>=0;i--) { c[i]=a[i]+b[i];//原本的new的c是有值的 } for(int i=n-1;i>=1;i--) { if(c[i]==2) { c[i-1]++; c[i]=c[i]%2; } } if(c[0]==2) c[0]=0; return c; } int main() { int a[3]={1,0,1}; int b[3]={0,1,1}; int *c=add(a,b,3); for(int i=0;i<3;i++) cout<<c[i]; delete[] c; return 0; }
2.2.2
void selectSort(int& a[],int len) { for(int i=0;i<len;i++)//n=len; { int t,max=-9999999; for(int j=i+1;j<len;j++)//1~len的和+1 { if(a[j]>max) //1~len的和 { max=a[j]; t=j; } } swap(a[i],a[t]); //len } //一共用时 3*len*(len-1)/2+1~len的和+1+len+len // o n^2 无最好和最差之分 }
2.2.3
线性查找
平均情况 (n+1)/2 o n
平均次数是(n+1)/2,不是n/2。
被查找的数是第1个数,则需用第1个数和被查找的数比较,要比较1次。
被查找的数是第2个数,则需用第1个数、第2个数和被查找的数比较,要比较2次。
...
被查找的数是第n个数,则需用第1个数、第2个数、...、第n个数和被查找的数比较,要比较n次。
平均次数为(1+2+...+n)/n=(n+1)/2。
最坏情况 o n
2.3-4 插入排序的递归
void insectionSort(int a[],int len) { if(len==1) return; insectionSort(a,len-1); int t=a[len-1]; int j=len-2; while(t>a[j]&&j>=0) { a[j+1]=a[j]; j--; } a[j+1]=t; }
T(n)=T(n-1)+o n