C++ 經典演算法 面試絕殺
阿新 • • 發佈:2019-02-01
1.連結串列逆序
2.連結串列合併
3.一棵樹是否某條路徑結點之和等於給定值。並描述演算法複雜度
4.你熟悉的排序演算法並描述演算法複雜度。
快速排序
歸併排序
堆排序
選擇排序
插入排序
氣泡排序
折半插入排序
以下程式碼都能成功通過。
1.連結串列逆序
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- struct node
- {
- int value;
- node * next;
- };
- node* make_link(void);
- node* reverse(node*);
- void display(node *);
- int main()
- {
- node *head=make_link();
- display(head);
- head=reverse(head);
- display(head);
- return 0;
- }
- node* make_link(void)
- {
- node *head=new node();
- node *cur=head;
- for
- {
- cur->value=rand()%10;
- cur->next=new node();
- cur=cur->next;
- }
- return head;
- }
- node* reverse(node *head)
- {
- node *pre,*post,*cur;
- if(!head && !head->next)
- return head;
- pre=head;
- cur=pre->next;
- while(cur)
- {
- post=cur->next;
- cur->next=pre;
- pre=cur;
- cur=post;
- }
- head->next=NULL;
- return pre;
- }
- void display(node * head)
- {
- node * cur=head;
- while(cur)
- {
- cout<<cur->value<<" ";
- cur=cur->next;
- }
- cout<<endl;
- }
#include <iostream>
using namespace std;
struct node
{
int value;
node * next;
};
node* make_link(void);
node* reverse(node*);
void display(node *);
int main()
{
node *head=make_link();
display(head);
head=reverse(head);
display(head);
return 0;
}
node* make_link(void)
{
node *head=new node();
node *cur=head;
for(int i=0;i<10;i++)
{
cur->value=rand()%10;
cur->next=new node();
cur=cur->next;
}
return head;
}
node* reverse(node *head)
{
node *pre,*post,*cur;
if(!head && !head->next)
return head;
pre=head;
cur=pre->next;
while(cur)
{
post=cur->next;
cur->next=pre;
pre=cur;
cur=post;
}
head->next=NULL;
return pre;
}
void display(node * head)
{
node * cur=head;
while(cur)
{
cout<<cur->value<<" ";
cur=cur->next;
}
cout<<endl;
}
2.連結串列合併
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- struct node
- {
- int value;
- node *next;
- };
- node *make_list(void);
- void display(node *);
- void sort(node *);
- node *merge(node *,node *);
- int main()
- {
- node *node1=make_list();
- display(node1);
- sort(node1);
- node *node2=make_list();
- display(node2);
- sort(node2);
- node *mnode=merge(node1,node2);
- display(mnode);
- return 0;
- }
- node *make_list(void)
- {
- node *head=new node();
- node *cur=head;
- for(int i=0;i<10;i++)
- {
- cur->value=rand()%10;
- cur->next=new node();
- cur=cur->next;
- }
- return head;
- }
- void display(node *head)
- {
- node *cur=head;
- while(cur)
- {
- cout<<cur->value<<" ";
- cur=cur->next;
- }
- cout<<endl;
- }
- void sort(node *head)
- {
- node *cur=head;
- while(cur)
- {
- node *min=cur;
- node *cur2=cur->next;
- while(cur2)
- {
- if(cur2->value < min->value)
- min=cur2;
- cur2=cur2->next;
- }
- int temp=cur->value;
- cur->value=min->value;
- min->value=temp;
- cur=cur->next;
- }
- }
- node *merge(node *h1,node *h2)
- {
- node *mcur=new node();
- node *cur1=h1;
- node *cur2=h2;
- while(cur1&&cur2)
- {
- if(cur1->value < cur2->value)
- {
- mcur->next=cur1;
- mcur=mcur->next;
- cur1=cur1->next;
- }
- else
- {
- mcur->next=cur2;
- mcur=mcur->next;
- cur2=cur2->next;
- }
- }
- if(cur1)
- mcur->next=cur1;
- else
- mcur->next=cur2;
- return h1->value < h2->value ? h1:h2;
- }
#include <iostream>
using namespace std;
struct node
{
int value;
node *next;
};
node *make_list(void);
void display(node *);
void sort(node *);
node *merge(node *,node *);
int main()
{
node *node1=make_list();
display(node1);
sort(node1);
node *node2=make_list();
display(node2);
sort(node2);
node *mnode=merge(node1,node2);
display(mnode);
return 0;
}
node *make_list(void)
{
node *head=new node();
node *cur=head;
for(int i=0;i<10;i++)
{
cur->value=rand()%10;
cur->next=new node();
cur=cur->next;
}
return head;
}
void display(node *head)
{
node *cur=head;
while(cur)
{
cout<<cur->value<<" ";
cur=cur->next;
}
cout<<endl;
}
void sort(node *head)
{
node *cur=head;
while(cur)
{
node *min=cur;
node *cur2=cur->next;
while(cur2)
{
if(cur2->value < min->value)
min=cur2;
cur2=cur2->next;
}
int temp=cur->value;
cur->value=min->value;
min->value=temp;
cur=cur->next;
}
}
node *merge(node *h1,node *h2)
{
node *mcur=new node();
node *cur1=h1;
node *cur2=h2;
while(cur1&&cur2)
{
if(cur1->value < cur2->value)
{
mcur->next=cur1;
mcur=mcur->next;
cur1=cur1->next;
}
else
{
mcur->next=cur2;
mcur=mcur->next;
cur2=cur2->next;
}
}
if(cur1)
mcur->next=cur1;
else
mcur->next=cur2;
return h1->value < h2->value ? h1:h2;
}
3.一棵樹是否某條路徑結點之和等於給定值。並描述演算法複雜度
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- struct node
- {
- int value;
- node *left;
- node *right;
- };
- node * build_tree(void);
- bool find(node *,int);
- int main()
- {
- node *tree=build_tree();
- int t;
- cout<<"Enter your number:";
- cin>>t;
- cout<<endl;
- cout<<find(tree,t)<<endl;
- }
- node *build_tree()
- {
- int a;
- cin>>a;
- if(a == 0)
- return NULL;
- node *root=new node();
- root->value=a;
- root->left=build_tree();
- root->right=build_tree();
- cout<<"build tree success"<<endl;
- return root;
- }
- bool find(node *root,int v)
- {
- if(!root)
- returnfalse;
- if(root->value == v)
- returntrue;
- else find(root->left,v-root->value) || find(root->right,v-root->value);
- }
#include <iostream>
using namespace std;
struct node
{
int value;
node *left;
node *right;
};
node * build_tree(void);
bool find(node *,int);
int main()
{
node *tree=build_tree();
int t;
cout<<"Enter your number:";
cin>>t;
cout<<endl;
cout<<find(tree,t)<<endl;
}
node *build_tree()
{
int a;
cin>>a;
if(a == 0)
return NULL;
node *root=new node();
root->value=a;
root->left=build_tree();
root->right=build_tree();
cout<<"build tree success"<<endl;
return root;
}
bool find(node *root,int v)
{
if(!root)
return false;
if(root->value == v)
return true;
else find(root->left,v-root->value) || find(root->right,v-root->value);
}
4.你熟悉的排序演算法並描述演算法複雜度。
快速排序
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- int partition(int a[],int low,int high)
- {
- int key=a[low]; //用子表的第一個記錄作杻軸記錄
- while(low < high) //從表的兩端交替地向中間掃描
- {
- while(low < high && a[high] >= key)
- --high;
- { //將比杻軸記錄小的記錄交換到低端
- int temp=a[low];
- a[low]=a[high];
- a[high]=temp;
- }
- while(low < high && a[low] <= key)
- ++low;
- { //將比杻軸記錄大的記錄交換到低端
- int temp=a[low];
- a[low]=a[high];
- a[high]=temp;
- }
- }
- return low; //返回杻軸所在的位置
- }
- void qsort(int a[],int b,int e)
- {
- if(b < e)
- {
- int m=partition(a,b,e);
- qsort(a,b,m-1);
- qsort(a,m+1,e);
- }
- }
- int main()
- {
- int a[]={2,3,7,8,3,5};
- qsort(a,0,5);
- for(int i=0;i<6;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- return 0;
- }
#include <iostream>
using namespace std;
int partition(int a[],int low,int high)
{
int key=a[low]; //用子表的第一個記錄作杻軸記錄
while(low < high) //從表的兩端交替地向中間掃描
{
while(low < high && a[high] >= key)
--high;
{ //將比杻軸記錄小的記錄交換到低端
int temp=a[low];
a[low]=a[high];
a[high]=temp;
}
while(low < high && a[low] <= key)
++low;
{ //將比杻軸記錄大的記錄交換到低端
int temp=a[low];
a[low]=a[high];
a[high]=temp;
}
}
return low; //返回杻軸所在的位置
}
void qsort(int a[],int b,int e)
{
if(b < e)
{
int m=partition(a,b,e);
qsort(a,b,m-1);
qsort(a,m+1,e);
}
}
int main()
{
int a[]={2,3,7,8,3,5};
qsort(a,0,5);
for(int i=0;i<6;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
歸併排序
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- void display(int a[],int size)
- {
- for(int i=0;i<size;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- }
- void mmerge(int *a,int low,int middle ,int high )
- {
- int fronArray[100],postArray[100];
- int front=middle-low+1;
- int post=high-middle;
- for(int i=0;i<front;i++)
- fronArray[i]=a[low+i];
- for(int j=0;j<post;j++)
- postArray[j]=a[middle+j+1];
- fronArray[front]=9999; //哨兵
- postArray[post]=9999;
- int i=0,j=0;
- for(int k=low;k<=high;k++)
- {
- if(fronArray[i]<postArray[j])
- a[k]=fronArray[i++];
- else
- a[k]=postArray[j++];
- }
- }
- void merge_sort(int *a,int low,int high)
- {
- if(low<high)
- {
- int middle=(low+high)/2;
- merge_sort(a,low,middle);
- merge_sort(a,middle+1,high);
- mmerge(a,low,middle,high);
- }
- }
- int main()
- {
- int a[]={9,3,5,7,6,8,10,22,21,34};
- display(a,10);
- merge_sort(a,0,9);
- display(a,10);
- return 0;
- }
#include <iostream>
using namespace std;
void display(int a[],int size)
{
for(int i=0;i<size;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void mmerge(int *a,int low,int middle ,int high )
{
int fronArray[100],postArray[100];
int front=middle-low+1;
int post=high-middle;
for(int i=0;i<front;i++)
fronArray[i]=a[low+i];
for(int j=0;j<post;j++)
postArray[j]=a[middle+j+1];
fronArray[front]=9999; //哨兵
postArray[post]=9999;
int i=0,j=0;
for(int k=low;k<=high;k++)
{
if(fronArray[i]<postArray[j])
a[k]=fronArray[i++];
else
a[k]=postArray[j++];
}
}
void merge_sort(int *a,int low,int high)
{
if(low<high)
{
int middle=(low+high)/2;
merge_sort(a,low,middle);
merge_sort(a,middle+1,high);
mmerge(a,low,middle,high);
}
}
int main()
{
int a[]={9,3,5,7,6,8,10,22,21,34};
display(a,10);
merge_sort(a,0,9);
display(a,10);
return 0;
}
堆排序
[cpp] view plain copy print?
- /*
- 堆排序
- (1)用大根堆排序的基本思想
- ① 先將初始檔案R[1..n]建成一個大根堆,此堆為初始的無序區
- ② 再將關鍵字最大的記錄R[1](即堆頂)和無序區的最後一個記錄R[n]交換,
- 由此得到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1].keys≤R[n].key
- ③ 由於交換後新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。
- 然後再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最後一個記錄R[n-1]交換,
- 由此得到新的無序區R[1..n-2]和有序區R[n-1..n],且仍滿足關係R[1..n- 2].keys≤R[n-1..n].keys,
- 同樣要將R[1..n-2]調整為堆。
- ……
- 直到無序區只有一個元素為止。
- (2)大根堆排序演算法的基本操作:
- ① 初始化操作:將R[1..n]構造為初始堆;
- ② 每一趟排序的基本操作:將當前無序區的堆頂記錄R[1]和該區間的最後一個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。
- 注意:
- ①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得檔案遞增有序。
- ②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。
- 堆排序和直接選擇排序相反:在任何時刻,堆排序中無序區總是在有序區之前,
- 且有序區是在原向量的尾部由後往前逐步擴大至整個向量為止。
- */
- #include <iostream>
- usingnamespace std;
- //生成大根堆
- void HeapAdjust(int SortData[],int StartIndex, int Length)
- {
- while(2*StartIndex+1 < Length)
- {
- int MaxChildrenIndex = 2*StartIndex+1 ;
- if(2*StartIndex+2 < Length )
- {
- //比較左子樹和右子樹,記錄最大值的Index
- if(SortData[2*StartIndex+1]<SortData[2*StartIndex+2])
- {
- MaxChildrenIndex = 2*StartIndex+2;
- }
- }
- if(SortData[StartIndex] < SortData[MaxChildrenIndex])
- {
- //交換i與MinChildrenIndex的資料
- int tmpData =SortData[StartIndex];
- SortData[StartIndex] =SortData[MaxChildrenIndex];
- SortData[MaxChildrenIndex] =tmpData;
- //堆被破壞,需要重新調整
- StartIndex = MaxChildrenIndex ;
- }
- else
- {
- //比較左右孩子均大則堆未破壞,不再需要調整
- break;
- }
- }
- }
- //堆排序
- void HeapSortData(int SortData[], int Length)
- {
- int i=0;
- //將Hr[0,Length-1]建成大根堆
- for (i=Length/2-1; i>=0; i--)
- {
- HeapAdjust(SortData, i, Length);
- }
- for (i=Length-1; i>0; i--)
- {
- //與最後一個記錄交換
- int tmpData =SortData[0];
- SortData[0] =SortData[i];
- SortData[i] =tmpData;
- //將H.r[0..i]重新調整為大根堆
- HeapAdjust(SortData, 0, i);
- }
- }
- //TestCase
- int main()
- {
- int SortData[] ={12,36,24,85,47,30,53,91};
- HeapSortData(SortData, 8);
- for (int i=0; i<8; i++)
- {
- cout<<SortData[i]<<" ";
- }
- cout<<endl;
- return 0;
- }
/*
堆排序
(1)用大根堆排序的基本思想
① 先將初始檔案R[1..n]建成一個大根堆,此堆為初始的無序區
② 再將關鍵字最大的記錄R[1](即堆頂)和無序區的最後一個記錄R[n]交換,
由此得到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1].keys≤R[n].key
③ 由於交換後新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。
然後再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最後一個記錄R[n-1]交換,
由此得到新的無序區R[1..n-2]和有序區R[n-1..n],且仍滿足關係R[1..n- 2].keys≤R[n-1..n].keys,
同樣要將R[1..n-2]調整為堆。
……
直到無序區只有一個元素為止。
(2)大根堆排序演算法的基本操作:
① 初始化操作:將R[1..n]構造為初始堆;
② 每一趟排序的基本操作:將當前無序區的堆頂記錄R[1]和該區間的最後一個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。
注意:
①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得檔案遞增有序。
②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。
堆排序和直接選擇排序相反:在任何時刻,堆排序中無序區總是在有序區之前,
且有序區是在原向量的尾部由後往前逐步擴大至整個向量為止。
*/
#include <iostream>
using namespace std;
//生成大根堆
void HeapAdjust(int SortData[],int StartIndex, int Length)
{
while(2*StartIndex+1 < Length)
{
int MaxChildrenIndex = 2*StartIndex+1 ;
if(2*StartIndex+2 < Length )
{
//比較左子樹和右子樹,記錄最大值的Index
if(SortData[2*StartIndex+1]<SortData[2*StartIndex+2])
{
MaxChildrenIndex = 2*StartIndex+2;
}
}
if(SortData[StartIndex] < SortData[MaxChildrenIndex])
{
//交換i與MinChildrenIndex的資料
int tmpData =SortData[StartIndex];
SortData[StartIndex] =SortData[MaxChildrenIndex];
SortData[MaxChildrenIndex] =tmpData;
//堆被破壞,需要重新調整
StartIndex = MaxChildrenIndex ;
}
else
{
//比較左右孩子均大則堆未破壞,不再需要調整
break;
}
}
}
//堆排序
void HeapSortData(int SortData[], int Length)
{
int i=0;
//將Hr[0,Length-1]建成大根堆
for (i=Length/2-1; i>=0; i--)
{
HeapAdjust(SortData, i, Length);
}
for (i=Length-1; i>0; i--)
{
//與最後一個記錄交換
int tmpData =SortData[0];
SortData[0] =SortData[i];
SortData[i] =tmpData;
//將H.r[0..i]重新調整為大根堆
HeapAdjust(SortData, 0, i);
}
}
//TestCase
int main()
{
int SortData[] ={12,36,24,85,47,30,53,91};
HeapSortData(SortData, 8);
for (int i=0; i<8; i++)
{
cout<<SortData[i]<<" ";
}
cout<<endl;
return 0;
}
選擇排序
[cpp] view plain copy print?
- //每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄
- #include <iostream>
- usingnamespace std;
- void selectSort(int a[],int size)
- {
- for(int i=0;i<size-1;i++)
- {
- int lowIndex =i;
- for(int j=size-1;j>i;j--)
- if(a[j]<a[lowIndex])
- lowIndex=j;
- int temp=a[i];
- a[i]=a[lowIndex];
- a[lowIndex]=temp;
- }
- }
- int main()
- {
- int a[]={12,36,24,85,47,30,53,91};
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- selectSort(a,8);
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- return 0;
- }
//每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄
#include <iostream>
using namespace std;
void selectSort(int a[],int size)
{
for(int i=0;i<size-1;i++)
{
int lowIndex =i;
for(int j=size-1;j>i;j--)
if(a[j]<a[lowIndex])
lowIndex=j;
int temp=a[i];
a[i]=a[lowIndex];
a[lowIndex]=temp;
}
}
int main()
{
int a[]={12,36,24,85,47,30,53,91};
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
selectSort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
插入排序
[cpp] view plain copy print?
- //將一個記錄插入到已經排好序的有序表中,從而得到一個新的 、記錄數增1的有序表
- #include <iostream>
- usingnamespace std;
- void insertSort(int a[],int size)
- {
- for(int i=1;i<size;i++)
- for(int j=i;(j>0)&&(a[j]<a[j-1]);j--)
- {
- int temp=a[j];
- a[j]=a[j-1];
- a[j-1]=temp;
- }
- }
- int main()
- {
- int a[]={12,36,24,85,47,30,53,91};
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- insertSort(a,8);
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- return 0;
- }
//將一個記錄插入到已經排好序的有序表中,從而得到一個新的 、記錄數增1的有序表
#include <iostream>
using namespace std;
void insertSort(int a[],int size)
{
for(int i=1;i<size;i++)
for(int j=i;(j>0)&&(a[j]<a[j-1]);j--)
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
int main()
{
int a[]={12,36,24,85,47,30,53,91};
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
insertSort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
氣泡排序
[cpp] view plain copy print?
- //在氣泡排序的過程中,關鍵字較小的記錄好比水中的氣泡逐趟向上漂浮,而關鍵字較大的記錄好比石塊往下沉,每一趟有一塊“最大”的石頭沉到水底。
- #include <iostream>
- usingnamespace std;
- void busort(int a[],int size)
- {
- for(int i=0;i<size-1;i++)
- for(int j=size-1;j>i;j--)
- if(a[j]<a[j-1])
- {
- int temp=a[j];
- a[j]=a[j-1];
- a[j-1]=temp;
- }
- }
- int main()
- {
- int a[]={12,36,24,85,47,30,53,91};
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- busort(a,8);
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- return 0;
- }
//在氣泡排序的過程中,關鍵字較小的記錄好比水中的氣泡逐趟向上漂浮,而關鍵字較大的記錄好比石塊往下沉,每一趟有一塊“最大”的石頭沉到水底。
#include <iostream>
using namespace std;
void busort(int a[],int size)
{
for(int i=0;i<size-1;i++)
for(int j=size-1;j>i;j--)
if(a[j]<a[j-1])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
int main()
{
int a[]={12,36,24,85,47,30,53,91};
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
busort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
折半插入排序
[cpp] view plain copy print?
- #include <iostream>
- usingnamespace std;
- void BInsertSort(int a[],int size)
- {
- for(int i=1;i<size;i++)
- {
- int temp=a[i]; //暫存a[i]
- int low=0;
- int high=i-1;
- while(low<=high)
- {
- int middle=(low+high)/2;
- if(temp<=a[middle])
- high=middle-1;
- else
- low=middle+1;
- }
- for(int j=i-1;j>=high+1;--j) //記錄後移
- a[j+1]=a[j];
- a[high+1]=temp; //插入,注意沒有補齊的地方要注意,不然是野指標指向莫名的值。
- }
- }
- int main()
- {
- int a[]={12,36,24,53,53,30,53,91};
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- BInsertSort(a,8);
- for(int i=0;i<8;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- return 0;
- }
#include <iostream>
using namespace std;
void BInsertSort(int a[],int size)
{
for(int i=1;i<size;i++)
{
int temp=a[i]; //暫存a[i]
int low=0;
int high=i-1;
while(low<=high)
{
int middle=(low+high)/2;
if(temp<=a[middle])
high=middle-1;
else
low=middle+1;
}
for(int j=i-1;j>=high+1;--j) //記錄後移
a[j+1]=a[j];
a[high+1]=temp; //插入,注意沒有補齊的地方要注意,不然是野指標指向莫名的值。
}
}
int main()
{
int a[]={12,36,24,53,53,30,53,91};
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
BInsertSort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}