算法-查找、排序方法

二分搜索

1、循环  //函数中有return,即找到第一个满足条件的就会退出,所以看具体情况用!

#include <cstdlib>
#include <iostream>
using namespace std;

int BinarySearch(int a[], const int& x, int l, int r)
{
     while (r >= l){ 
        int m = (l+r)/2;
        if (x == a[m]) return m;
        if (x < a[m]) 
             r = m-1; 
        else 
             l = m+1;
        }
    return -1;
} 

int main(int argc, char *argv[])
{
    int a[10]={1,6,9,12,14,19,25,26,29,30},x;
    while(cin>>x)
    {
         int index;
         index=BinarySearch(a,x,0,9);  
         if(index>=0)
            cout<<index<<endl;
         else
            cout<<"Not Find!"<<endl; 
    }              
    system("PAUSE");
    return 0;
}

2、递归

#include <iostream>
using namespace std;

template <class T>
int BinarySearch(T A[], T v, int l, int r)
{
   int j;
   if( l > r  && v!=A[l])
      return -1;
   j=(r+l)/2;
   if( v == A[j])
      return j;
   else if (v < A[j])
             return BinarySearch(A,v,l,j-1);
         else
             return BinarySearch(A,v,j+1,r);
} 

int main(int argc, char *argv[])
{
    int a[10]={1,6,9,12,14,19,25,26,29,30},x;
    while(cin>>x)
    {
         int index;
         index=BinarySearch(a,x,0,9);  
         if(index>=0)
            cout<<index<<endl;
         else
            cout<<"Not Find!"<<endl; 
    }              
    system("PAUSE");
    return 0;
}

快速排序: 

int Partition (Elem R[], int low, int high) {
R[0] = R[low];    // 用子表的第一个记录作枢轴记录
pivotkey = R[low].key; // 枢轴记录关键字
while (low<high) {  // 从表的两端交替地向中间扫描
    while(low<high&& R[high].key>=pivotkey)   --high;
    R[low] = R[high];   // 将比枢轴记录小的记录移到低端
   while (low<high && R[low].key<=pivotkey)   ++low;
    R[high] = R[low];   // 将比枢轴记录大的记录移到高端
  }
R[low] = R[0]; // 枢轴记录到位
return low; // 返回枢轴位置
} // Partition

void QSort (Elem R[], int low, int high) {
    // 对记录序列R[low..high]进行快速排序
   if (low < high-1) { // 长度大于1
      pivotloc = Partition(L, low, high);
                   // 将.r[low..high]一分为二
      QSort(L, low, pivotloc-1);
             // 对低子表递归排序,pivotloc是枢轴位置
      QSort(L, pivotloc+1, high);       // 对高子表递归排序
   }
} // QSort


合并排序:(递归)

#include<iostream>
using namespace std;
const int N=100;
template <class T>
void Merge(T A[], int p, int q, int r)
{
     int n1 =q - p + 1;        //第一个合并数据的长度
     int n2 = r -q;           //第二个合并数据的长度 
     T *L = new T[n1 + 1];        //申请一个保存第一个数据的空间
     T *R = new T[n2 + 1];        //申请二个保存第一个数据的空间
    for (int i = 0; i < n1; ++i)        //复制第一个数据到临时空间里面
     {
        L[i] = A[p + i];
     }
     L[n1] = INT_MAX;                    //将最后一个数据设置为最大值(哨兵)
     for (int i = 0; i < n2; ++i)        //复制第二个数据到临时空间里面
     {
         R[i] = A[q + i + 1];
     }
     R[n2] = INT_MAX;                    //将最后一个数据设置为最大值(哨兵)
     n1 =  n2 = 0;
      while(p <= r)
     {
         A[p++] = L[n1] <  R[n2] ? L[n1++] : R[n2++];        //取出当前最小值到指定位置
     }
     delete L;
     delete R;
}
template <class T>
void MergeSort(T A[], int p, int r)
{
     int q;
     if(p<r)
     {
        q=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r);
     }
}
int main()
{
    int A[N],i,n;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
          cin>>A[i];
        MergeSort(A,0,n-1);
        for(i=0;i<n;i++)
          cout<<A[i]<<" ";
        cout<<endl;
    }
    return 0;
}

/*
8 5 2 4 7 1 3 2 6
9 5 4 1 8 3 11 7 2 9
*/  


选择排序:

#include<iostream>
using namespace std;
const int N=10;

template <class T>

void select_sort(T a[],int n)
{
     int i,j,min;
     T temp;
     for(i=0;i<n-1;i++)
     {
         min=i;
         for(j=i+1;j<n;j++)
            if(a[min]>a[j])
                min=j;
         temp=a[i];
         a[i]=a[min];
         a[min]=temp;
     }
}
                 
int main()
{
    int a[N]={20,10,45,54,3,6,78,9,49,61};
    int i;
    select_sort(a,N);
    for(i=0;i<N;i++)
      cout<<a[i]<<" ";
    system("pause");
    return 0;
}

插入排序:

1、直接插入排序:

void insertsort(Sqlist &L)
{    int j;//注意下面j要在if之后用
    for(int i=2;i<=L.length;i++)
       if(L.elem[i]<L.elem[n-1]) {
           L.elem[0]=L.elem[i];
           L.elem[i]=L.elem[i-1];
           for(j=n-2;L.elem[0]<L.elem[j];j--)
             L.elem[j+1]=L.elem[j];
            L.elem[j+1]=L.elem[0];
   }
}

1、循环

#include<iostream>
using namespace std;
void Insert(int a[],int n,int e)
{
    for(int i=0;i<n;i++)
        if(e<=a[i])
    {
        for(int j=n-1;j>=i;j--)
        a[j+1]=a[j];
        a[i]=e;
        break;
    }
}
void Sort(int a[],int n)
{
    for(int i=1;i<n;i++)
    Insert(a,i,a[i]);
}
int main()
{
    int a[10];
    for(int i=0;i<8;i++)
    cin>>a[i];
    Sort(a,8);
    for(int i=0;i<8;i++)
    cout<<a[i]<<" ";
}
2、递归方法

#include<iostream>
using namespace std;
const int N=100;
template <class T>
void InsertSort(T A[],int s,int e)//s为起始下标,e为最后一个元素下标
{
     int i;
     T temp;
     if (s<e)
     {
          InsertSort(A,s,e-1);
          i=e-1;
          temp=A[e];
          while (i>=0&&A[i]>temp)
          {
                A[i+1]=A[i];
                i--;
          }
          A[++i]=temp;
     }
}
int main()
{
    int A[N],i,n;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
          cin>>A[i];
        InsertSort(A,0,n-1);
        for(i=0;i<n;i++)
          cout<<A[i]<<" ";
        cout<<endl;
    }
    return 0;
}

/*
8 5 2 4 7 1 3 2 6
9 5 4 1 8 3 11 7 2 9
*/



冒泡法排序:


猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/79845100