基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序

来源:互联网 发布:全境封锁优化 编辑:程序博客网 时间:2024/05/16 17:32

二分法查找算法:

#include<iostream>

using namespace std;

 

int binarysearch(int * a,int n,int num);

 

 

int main()

{

       inta[5]={9,8,5,7,3};

       for(inti=0;i<5;i++)

              for(intj=i+1;j<5;j++)

                     if(a[i]>a[j])

                            swap(a[i],a[j]);    //排序

    for(i=0;i<5;i++)

               cout<<a[i]<<",";

        cout<<endl;

        int e=binarysearch(a,5,3);    //二分查找

        cout<<"二分法查找:"<<a[e-1]<<endl;;

      

       return0;

}

int binarysearch(int * a,int n,int num)

{

       if(n<=0)                       //如果n小于零,则函数结束

              returnNULL;

       else

       {

              intmid=n/2;              //取数组中间的元素,mid作为数组下标进行元素的比较,如果相等,则第mid+1个元素为要查找的元素

              if(a[mid]==num)

                     returnmid+1;

              else

              {

                     if(num<a[mid])        //如果num小于下标为mid的元素,则从该元素的左边进行二分法查找,右边忽略

                      return binarysearch(a,mid,num);

                     else

                      return binarysearch(a+mid,n-(mid+1),num); //如果num大于下标为mid的元素,则从该元素的右边进行二分法查找,左边忽略

              }

       }

}



合并排序算法—递归

 

#include<iostream>

using namespace std;

 

 

 

template<class T>

void Merge(T c[],T d[],int l,int m,int r)

{

       //合并c[l:m]和c[m+1:r]到d[l:r]

       inti=l,j=m+1,k=l;

       while((i<=m)&&(j<=r))  //如果i小于m并且j小于数组的边界,则由i位置数据与j位置数据比较,较小的放到b的相应位置

              if(c[i]<=c[j])

                     d[k++]=c[i++];

              else

                     d[k++]=c[j++];

       if(i>m)                

              for(intq=j;q<=r;q++)

                     d[k++]=c[q];

       else

              for(intq=i;q<=m;q++)

                     d[k++]=c[q];

 

}

 

template<class T>

void Copy(T a[],T b[],int left,int right)

{

       for(inti=left;i<=right;i++)

              a[i]=b[i];

 

}

 

 

template<class T>

void MergeSort(T a[],int left,int right)

{

       if(left<right)         //至少有2个元素

       {

              inti=(left+right)/2; //取中点

              Tb[100];

              MergeSort(a,left,i);

              MergeSort(a,i+1,right);

              Merge(a,b,left,i,right);  //合并到数组b

              Copy(a,b,left,right);     //复制回数组a

       }

 

}

 

 

int main()

{

       inta[8]={4,8,3,7,1,5,6,2};

       MergeSort(a,0,7);

       for(inti=0;i<8;i++)

              cout<<a[i]<<",";

       cout<<endl;

       return0;

}




冒泡排序:


#include<iostream>
using namespace std;


template<class T>
void Sort(T a[],int n)      //冒泡排序
{
bool changed=false;     //设置bool变量记录是否发生交换,当上一轮发生交换则进行下一轮排序
                       //当不发生交换时,则不用进行下一轮排序,冒泡排序结束
do 
{
changed=false;
for(int i=1;i<n;i++)
if(a[i-1]>a[i])        //判断相邻的两个元素的大小,小的放在前面
{
swap(a[i-1],a[i]);
changed=true;
}
} while (changed);


}




int main()
{
int a[8]={4,3,7,1,5,6,8,2};
Sort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<",";


cout<<endl;


return 0;
}


插入排序:

 

#include<iostream>

using namespace std;

 

 

template<class T>

void insertSort(T a[],int n)  //插入排序

{

       intt;                   

       for(inti=1;i<n;i++)      //从数组的第二个元素开始与前边的进行比较,当前边的元素不大于该元素时插入该元素

       {

              t=a[i];              

              for(intj=i;j>0&&t<a[j-1];j--)  //当前边的元素大于该元素时,前边的元素向后移一位

                     a[j]=a[j-1];

              a[j]=t;

       }

}

 

 

int main()

{

       inta[8]={3,7,6,4,5,8,2,1};

       insertSort(a,8);

       for(inti=0;i<8;i++)

              cout<<a[i]<<",";

       cout<<endl;

       return0;

}


选择排序:

#include<iostream>

using namespace std;

 

template<class T>

void selSort(T a[],int n)

{

       intmin;

       //反复n-1次

       for(inti=0;i<n-1;i++)

       {

              min=i;

              for(intj=i+1;j<n;j++)

                     if(a[j]<a[min])

                            min=j;

              //把它跟第i个元素交换

              swap(a[i],a[min]);

       }

 

}

 

int main()

{

       inta[8]={3,2,5,7,8,4,1,6};

       selSort(a,8);

       for(inti=0;i<8;i++)

              cout<<a[i]<<",";

       cout<<endl;

       return0;

}


快速排序:

      分治法

#include<iostream>

using namespace std;

 

template<class T>

int Partition(T a[],int p,int r)

{

       inti=p,j=r+1;

       Tx=a[p];

       //将<x的元素交换到左边区域

       //将>x的元素交换到右边区域

       while(true)

       {

              while(a[++i]<x&&i<r);  //当i位置的元素小于x的值则i位置向下移

                     while(a[--j]>x);   //同理j位置向前移

                                        //当i位置不大于j位置且i位置元素大于x且j位置元素小于x,则交换i和j位置的元素

                            if(i>=j)

                                   break;

              swap(a[i],a[j]);

 

       }

 

       a[p]=a[j];

       a[j]=x;

       returnj;

 

}

 

template<class T>

void QuickSort(T a[],int p,int r)

{

       if(p<r)

       {

              intq=Partition(a,p,r);

              QuickSort(a,p,q-1);

              QuickSort(a,q+1,r);

       }

 

}

 

 

int main()

{

       inta[8]={3,5,2,6,8,7,1,4};

       QuickSort(a,0,7);

       for(inti=0;i<8;i++)

              cout<<a[i]<<",";

       cout<<endl;

       return0;

}