1、给出折半插入排序的代码?
答、
int main(){
int i,j,low,high,mid,temp;
int srcsum[10]={10,91,8,71,61,5,41,3,21,1};
for(i=2;i<sizeof(srcsum)/4;i++)
{
temp=srcsum[i];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(srcsum[mid]>temp)high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--)
{
srcsum[j+1]=srcsum[j];
}
srcsum[high+1]=temp;
}
for(int i=0;i<sizeof(srcsum)/4;i++)
{
printf("srcsum[%d]=%d",i,srcsum[i]);
}
}
2、冒泡排序?
答、
int main01(int argc, char *argv[])
{
// bubble sorting
int src[10]={3,1,55,23,15,11,78,13,2,56};
for(int i=0;i<sizeof(src)/4;i++)
{
for(int j=sizeof(src)/4-1;j>i;j--)
{
if(src[j]<src[j-1])
{
int temp=src[j];
src[j]=src[j-1];
src[j-1]=temp;
}
}
}
for(int i=0;i<sizeof(src)/4;i++)
{
printf("src[%d]=%d ",i,src[i]);
}
printf("Hello World!\n");
return 0;
}
优化的冒泡排序?
答、
public void bubbleSort(int arr[]) {
boolean didSwap;
for(int i = 0, len = arr.length; i < len - 1; i++) {
didSwap = false;
for(int j = 0; j < len - i - 1; j++) {
if(arr[j + 1] < arr[j]) {
swap(arr, j, j + 1);
didSwap = true;
}
}
if(didSwap == false)
return;
}
}
3、选择排序?
答、
int main02()
{
// choose
int srcnum[10]={10,9,8,7,6,5,4,3,2,1};
int min=0;
for(int i=0;i<sizeof(srcnum)/4;i++)
{
min=i;
for(int j=i+1;j<sizeof(srcnum)/4;j++)
{
if(srcnum[min]>srcnum[j])
{
min=j;
}
}
int temp=srcnum[i];
srcnum[i]=srcnum[min];
srcnum[min]=temp;
}
for(int i=0;i<sizeof(srcnum)/4;i++)
{
printf("srcnum[%d]=%d ",i,srcnum[i]);
}
return 0;
}
4、插入排序?
答、
int main03()
{
// insert
int srcnum[10]={10,91,8,71,61,5,41,3,21,1};
int j=0;
for(int i=1;i<sizeof(srcnum)/4;i++)
{
int temp=srcnum[i];
for(j=i-1;j>=0&&(srcnum[j]>temp);--j)
{
srcnum[j+1]=srcnum[j];
}
srcnum[j+1]=temp;
}
for(int i=0;i<sizeof(srcnum)/4;i++)
{
printf("srcnum[%d]=%d ",i,srcnum[i]);
}
return 0;
}
5、快速排序?
答、
int pivotPosition(int srcsum[1],int pivot,int low,int high)
{
while(low<high)
{
while((low<high)&&(srcsum[high]>=pivot))high--;
srcsum[low]=srcsum[high];
while((low<high)&&(srcsum[low]<=pivot))low++;
srcsum[high]=srcsum[low];
}
srcsum[low]=pivot;
return low;
}
void QuickSort(int *srcsum,int low,int high)
{
if(low<high)
{
int pos=pivotPosition(srcsum,srcsum[low],low,high);
QuickSort(srcsum,low,pos-1);
QuickSort(srcsum,pos+1,high);
}
}
int main()
{
int srcsum[10]={101,900,8,7,6,5,4,3,21,11};
int pivot=srcsum[0];
int low=0,high=sizeof(srcsum)/4-1;
QuickSort(srcsum,low,high);
for(int i=0;i<sizeof(srcsum)/4;i++)
{
printf("srcsum[%d]=%d ",i,srcsum[i]);
}
return 0;
}
7、堆排序?
答、
void AdjustDownMy(int *arr,int k,int len);
void bigRootPile(int *arr,int len)
{
for(int i=len/2;i>=0;i--)
{
AdjustDownMy(arr,i,len);
}
}
void AdjustDownMy(int *arr,int k,int len)
{
int temp=arr[k];
for(int i=2*k;i<=len;i*=2)
{
if((i<len)&&(arr[i]<arr[i+1]))
{
i++;
}
if(temp>=arr[i])break;
else
{
arr[k]=arr[i];
k=i;
}
}
arr[k]=temp;
}
void BigSort(int *arr,int len)
{
for(int i=0;i<=len;i++)
{
int temp=arr[0];
arr[0]=arr[len-i];
arr[len-i]=temp;
AdjustDownMy(arr,0,len-i-1);
}
}
8、归并排序?
答、
int *B=NULL;
void Merge(int *A,int low,int mid,int high)
{
for(int i=low;i<=high;i++)
{
B[i]=A[i];
}
int k=low;
int i,j;
for(i=low,j=mid+1;i<=mid&&j<=high;)
{
if(B[i]<B[j])
{
A[k++]=B[i++];
}else
{
A[k++]=B[j++];
}
}
while(i<=mid)
{
A[k++]=B[i++];
}
while(j<=high)
{
A[k++]=B[j++];
}
}
void MergeSort(int *arr,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
MergeSort(arr,low,mid);
MergeSort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
}
int main()
{
int A[8]={11,13,15,17,1,3,5,7};
// int A[9]={111,103,15,7,1100,333,5,17,1};
B=(int *)malloc(sizeof(A));
// Merge(A,0,3,7);
// MergeSort(A,0,8);
MergeSort(A,0,7);
for(int i=0;i<8;i++)
{
printf("%d ",A[i]);
}
return 0;
}
------------------------------------------------------------
常用查找算法:
1、问查找算法是根据什么选择的,如何分类?
答、数据结构(线性结构、树形结构、散列结构);
不同数据结构对应的查找算法有哪些?
答、线性结构:顺序查找、折半查找、分块查找;
树形结构:二叉排序树、二叉平衡树、B树、B+树;
散列结构:散列表;
2、KMP字符串匹配
void get_nextOne(char T[],int next[]){
int i=1,j=0;
next[0]=0;
while(i<=T[0])
{
if(j==0||T[i]==T[j])
{
++i;
++j;
next[i-1]=j;
}
else
{
j=next[j-1];
}
}
}
int KMPOne(char S[],char T[],int next[],int pos)
{
if(pos==0)
{
return -1;
}
int i=pos,j=1;
while(i<S[0]&&j<T[0]){
if(j==0||S[i]==T[j]){
++i;
++j;
}
else{
j=next[j-1];
}
}
if(j==T[0])
{
return 0;
}else
{
return -1;
}
}
简单字符串匹配
int Index(char*S,char *T)
{
int i=1,j=1;
while(i<=s[0]&&j<=T[0])
{
if(S[i]==T[j]){
++i;++j;
}else
{
i=i-j+2;j=1;
}
if(j>T[0])return i-T[0];
else
return 0;
}
答、
int main(){
int i,j,low,high,mid,temp;
int srcsum[10]={10,91,8,71,61,5,41,3,21,1};
for(i=2;i<sizeof(srcsum)/4;i++)
{
temp=srcsum[i];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(srcsum[mid]>temp)high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--)
{
srcsum[j+1]=srcsum[j];
}
srcsum[high+1]=temp;
}
for(int i=0;i<sizeof(srcsum)/4;i++)
{
printf("srcsum[%d]=%d",i,srcsum[i]);
}
}
2、冒泡排序?
答、
int main01(int argc, char *argv[])
{
// bubble sorting
int src[10]={3,1,55,23,15,11,78,13,2,56};
for(int i=0;i<sizeof(src)/4;i++)
{
for(int j=sizeof(src)/4-1;j>i;j--)
{
if(src[j]<src[j-1])
{
int temp=src[j];
src[j]=src[j-1];
src[j-1]=temp;
}
}
}
for(int i=0;i<sizeof(src)/4;i++)
{
printf("src[%d]=%d ",i,src[i]);
}
printf("Hello World!\n");
return 0;
}
优化的冒泡排序?
答、
public void bubbleSort(int arr[]) {
boolean didSwap;
for(int i = 0, len = arr.length; i < len - 1; i++) {
didSwap = false;
for(int j = 0; j < len - i - 1; j++) {
if(arr[j + 1] < arr[j]) {
swap(arr, j, j + 1);
didSwap = true;
}
}
if(didSwap == false)
return;
}
}
3、选择排序?
答、
int main02()
{
// choose
int srcnum[10]={10,9,8,7,6,5,4,3,2,1};
int min=0;
for(int i=0;i<sizeof(srcnum)/4;i++)
{
min=i;
for(int j=i+1;j<sizeof(srcnum)/4;j++)
{
if(srcnum[min]>srcnum[j])
{
min=j;
}
}
int temp=srcnum[i];
srcnum[i]=srcnum[min];
srcnum[min]=temp;
}
for(int i=0;i<sizeof(srcnum)/4;i++)
{
printf("srcnum[%d]=%d ",i,srcnum[i]);
}
return 0;
}
4、插入排序?
答、
int main03()
{
// insert
int srcnum[10]={10,91,8,71,61,5,41,3,21,1};
int j=0;
for(int i=1;i<sizeof(srcnum)/4;i++)
{
int temp=srcnum[i];
for(j=i-1;j>=0&&(srcnum[j]>temp);--j)
{
srcnum[j+1]=srcnum[j];
}
srcnum[j+1]=temp;
}
for(int i=0;i<sizeof(srcnum)/4;i++)
{
printf("srcnum[%d]=%d ",i,srcnum[i]);
}
return 0;
}
5、快速排序?
答、
int pivotPosition(int srcsum[1],int pivot,int low,int high)
{
while(low<high)
{
while((low<high)&&(srcsum[high]>=pivot))high--;
srcsum[low]=srcsum[high];
while((low<high)&&(srcsum[low]<=pivot))low++;
srcsum[high]=srcsum[low];
}
srcsum[low]=pivot;
return low;
}
void QuickSort(int *srcsum,int low,int high)
{
if(low<high)
{
int pos=pivotPosition(srcsum,srcsum[low],low,high);
QuickSort(srcsum,low,pos-1);
QuickSort(srcsum,pos+1,high);
}
}
int main()
{
int srcsum[10]={101,900,8,7,6,5,4,3,21,11};
int pivot=srcsum[0];
int low=0,high=sizeof(srcsum)/4-1;
QuickSort(srcsum,low,high);
for(int i=0;i<sizeof(srcsum)/4;i++)
{
printf("srcsum[%d]=%d ",i,srcsum[i]);
}
return 0;
}
7、堆排序?
答、
void AdjustDownMy(int *arr,int k,int len);
void bigRootPile(int *arr,int len)
{
for(int i=len/2;i>=0;i--)
{
AdjustDownMy(arr,i,len);
}
}
void AdjustDownMy(int *arr,int k,int len)
{
int temp=arr[k];
for(int i=2*k;i<=len;i*=2)
{
if((i<len)&&(arr[i]<arr[i+1]))
{
i++;
}
if(temp>=arr[i])break;
else
{
arr[k]=arr[i];
k=i;
}
}
arr[k]=temp;
}
void BigSort(int *arr,int len)
{
for(int i=0;i<=len;i++)
{
int temp=arr[0];
arr[0]=arr[len-i];
arr[len-i]=temp;
AdjustDownMy(arr,0,len-i-1);
}
}
8、归并排序?
答、
int *B=NULL;
void Merge(int *A,int low,int mid,int high)
{
for(int i=low;i<=high;i++)
{
B[i]=A[i];
}
int k=low;
int i,j;
for(i=low,j=mid+1;i<=mid&&j<=high;)
{
if(B[i]<B[j])
{
A[k++]=B[i++];
}else
{
A[k++]=B[j++];
}
}
while(i<=mid)
{
A[k++]=B[i++];
}
while(j<=high)
{
A[k++]=B[j++];
}
}
void MergeSort(int *arr,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
MergeSort(arr,low,mid);
MergeSort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
}
int main()
{
int A[8]={11,13,15,17,1,3,5,7};
// int A[9]={111,103,15,7,1100,333,5,17,1};
B=(int *)malloc(sizeof(A));
// Merge(A,0,3,7);
// MergeSort(A,0,8);
MergeSort(A,0,7);
for(int i=0;i<8;i++)
{
printf("%d ",A[i]);
}
return 0;
}
------------------------------------------------------------
常用查找算法:
1、问查找算法是根据什么选择的,如何分类?
答、数据结构(线性结构、树形结构、散列结构);
不同数据结构对应的查找算法有哪些?
答、线性结构:顺序查找、折半查找、分块查找;
树形结构:二叉排序树、二叉平衡树、B树、B+树;
散列结构:散列表;
2、KMP字符串匹配
void get_nextOne(char T[],int next[]){
int i=1,j=0;
next[0]=0;
while(i<=T[0])
{
if(j==0||T[i]==T[j])
{
++i;
++j;
next[i-1]=j;
}
else
{
j=next[j-1];
}
}
}
int KMPOne(char S[],char T[],int next[],int pos)
{
if(pos==0)
{
return -1;
}
int i=pos,j=1;
while(i<S[0]&&j<T[0]){
if(j==0||S[i]==T[j]){
++i;
++j;
}
else{
j=next[j-1];
}
}
if(j==T[0])
{
return 0;
}else
{
return -1;
}
}
简单字符串匹配
int Index(char*S,char *T)
{
int i=1,j=1;
while(i<=s[0]&&j<=T[0])
{
if(S[i]==T[j]){
++i;++j;
}else
{
i=i-j+2;j=1;
}
if(j>T[0])return i-T[0];
else
return 0;
}