基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
来源:互联网 发布:全境封锁优化 编辑:程序博客网 时间: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;
}
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 冒泡排序、选择排序、插入排序以及二分法查找算法
- 选择排序&插入排序&冒泡排序&快速排序算法实现
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 冒泡排序,选择排序,插入排序,希尔排序,合并排序,快速排序算法
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- 基础排序算法总结(插入、选择、冒泡、合并、二分查找、堆排序、快速排序、基数排序、桶排序、计数排序)
- 冒泡排序、选择排序、快速排序、二分法查找
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 基本排序算法(冒泡排序,选择排序,插入排序)
- java实现冒泡排序,插入排序,选择排序,快速排序
- python 实现插入排序,冒泡排序,快速排序,选择排序
- PHP实现几种基本排序算法--冒泡排序法,快速排序法,选择排序法,插入排序法
- Java基本排序实现--插入排序,选择排序,冒泡排序
- 简单排序算法:冒泡排序,选择排序,插入排序
- 密码文件
- 嵌入式Linux学习(二)
- 设置应用内的系统控件语言
- MYSQL入门学习之四:MYSQL的数据类型
- 概率论
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- Android面试题__2013_07_25
- hdu 1213 How Many Tables(并查集练习)
- OpenCV中特征检测,提取与匹配使用方法学习
- Asp.net 页面生命周期:从OnPreInit到End Render
- 在iOS中使用ZXing库
- 异或的性质和运算
- scanf 的总结
- 播放器缓冲界面显示加载速度