二分搜索
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
*/
冒泡法排序: