1.设计一个算法指出在一个无序关键字序列中的某个关键字是该序列中的第几个关键字(从小到大数),序列中关键字均为整数类型,且各不相同,要求比较的次数尽可能的少。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int getPos(int arr[],int n,int k) { int i=0,j=n-1; int temp; while(i<=j) { while(i<n&&arr[i]<=k) ++i; while(j>=0&&arr[j]>k) --j; if(i<j) { temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; ++i; --j; } } return j+1; }
|
2.设计一个用二分查找法来找插入位置的改进的**插入排序算法??**。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void BSSort(int arr[],int n) { int low,high,mid,place; for(int i=2;i<=n;++i) { low=1;high=i-1; arr[0]=arr[i]; while(low<=high) { mid=(low+high)/2; if(arr[0]<arr[mid]) high=mid+1; else low=mid+1; } place=low; for(int j=i-1;j>=place;--j) arr[j+1]=arr[j]; arr[place]=arr[0]; } }
|
3.设计快速排序的递归和非递归算法**??**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| void partition(int arr[],int low,int high,int &i) { int i; int temp; i=low; j=high; temp=arr[i]; while(i<j) { while(i<j&&arr[j]>=temp) --j; if(i<j) { arr[i]=arr[j]; ++i; } while(i<j&&arr[i]<temp) ++i; if(i<j) { arr[j]=arr[i]; --j; }
} arr[i]=temp; }
void quickSort(int arr[],int low,int high) { int i; if(low<high) { partition(arr,low,high,i); quickSort(arr,low,i-1); quickSort(arr,i+1,high); } }
void quickSortNonrecursion(int arr[],int n) { int i,low,high; int stack[maxSize][2],top=-1; low0;high=n-1; ++top; stack[top][0]=low; stack[top][1]=high; while(top>=0) { low=stack[top][0]; high=stack[top][1]; --top; partition(arr,low,high,i) if(low<high) { ++top; stack[top][0]=low; stack[top][1]=i-1; ++top; stack[top][0]=i+1; stack[top][1]=high; } } }
|
4.设有整数0~n-1存放在整形数组A[0,1,2,…n-1]中,请设计一个时间复杂度为O(n),空间复杂度为O(1)的算法来是实现对A的排序(要求从小到大)。
1 2 3 4 5 6
| void order(int A[],int n) { int i; for(i=0;i<n;++i) A[A[i]]=A[i]; }
|
5.编写一个是实现在排序二叉树中将data域(整型)值小于x的结点全部删除的算法。树中存在data域为x的结点且不存在data域值相同的结点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void deleteBT(BTNode *&t) { if(t!=NULL) { deleteBT(t->lChild); deleteBT(t->rChild); free(t); t=NULL; } } void findAndDeleteBT(BTNode *&t,int x) { while(t!=NULL) { if(t->data==x) { deleteBT(t->lChild); return; } else if(t->data<x) t=t->rChild; else t=t->lChild; } }
|