由于一直希望能自主用c++实现这几种算法,于是今天把这几种都实现了一下,程序没有加其他的内容,比较基础,数据一个整型数组
1、插入排序
#include<iostream>
#include<stdio.h>
using namespace std;
#define INVALID_INDEX -10
//插入排序
void Insert_sort(int A[], int n){
int key=0;
int i=0;
for (int j=1;j<n;j++)
{
key=A[j];
i=j-1;
while (i>=0&&A[i]>key)
{
A[i+1]=A[i];
i--;
}
A[i+1]=key;
}
}
2、归并排序
//归并排序合并操作
void Merge(int *A,int begin,int mid, int end){
int n1=mid-begin+1;//左堆牌数
int n2=end-mid;//右堆牌数
int *L=new int[n1+1];//增加了一个哨兵牌的新左堆,L[N1]为哨兵位
int *R=new int[n2+1];//增加了一个哨兵牌的新右堆,R[N1]为哨兵位
for (int i=0;i<n1;i++)//原左堆牌放入新左堆
{
L[i]=A[begin+i];
}
for (int j=0;j<n2;j++)//原右堆牌放入新右堆
{
R[j]=A[mid+j+1];
}
L[n1]=100000000;//新左堆最后一位放哨兵牌,数值为一个很大的数
R[n2]=100000000;//新右堆最后一位放哨兵牌,数值为一个很大的数
//比较新左右堆顶牌大小,较小者放入新堆A[]中
int i=0,j=0;
for (int k=begin;k<=end;k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
delete []L;
delete []R;
}
//归并排序子序列排序操作
void Merge_sort(int *A,int begin,int end){
if (begin<end)
{
//一分为二
int mid=(begin+end)/2;
Merge_sort(A,begin,mid);
Merge_sort(A,mid+1,end);
Merge(A,begin,mid,end);
}
}
//快速排序子程序partition
int Partition(int*A,int begin, int end){
int x=A[begin];//选择第一个数为主元数据
int i=begin;
for (int j=begin+1;j<end;j++)//向右扫描,直到发现一个小或者等于主元的数,j不断地加1
{
if (A[j]<=x)//当遇到小于或等于主元x的数时,i加1后,并将A[i]和A[j]互换,同时j还在原来的位置,然后继续向右
{
int temp=0;
i++;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
//直到j到末尾后,上面的循环结束,将主元数据放到两个子串中间,即A[begin]和A[i]交换
int temp2=0;
temp2=A[begin];
A[begin]=A[i];
A[i]=temp2;
return i;//返回
}
//快速排序
void Quicksort(int*A,int begin,int end)
{
if (begin<end)
{
int mid=Partition(A,begin,end);
Quicksort(A,begin,mid-1);
Quicksort(A,mid+1,end);
}
}
4、二分查找
//二分查找,注意begin==end是递归的出口,表示已经找到了最好一个数,还是没找到,则退出递归,否则程序将死循环
//故在每次递归调用时,先判断是否有begin<end
int BinarySearch(int*A,int begin,int end, int key){
int index=INVALID_INDEX;
int mid=(begin+end)/2;
if (A[mid]==key)//若中间元素为key,找到,index=mid
{
index=mid;
}
if(A[mid]<key&&begin<end)//中间元素小于key,表示元素在右边
{
index=BinarySearch(A,mid+1,end,key);//继续在mid右边查找
}
if(A[mid]>key&&begin<end)//中间元素大于key,表示元素在左右边
{
index=BinarySearch(A,begin,mid-1,key);//继续在mid左边查找
}
return index;
}
5、主函数
int main()
{
int a[7]={3,6,2,4,1,7,8};
Merge_sort(a,0,6);
Insert_sort(a,7);
Quicksort(a,0,6);
int index=BinarySearch(a,0,6,8);
if (index!=INVALID_INDEX)
{
cout<<"The element existing is:"<<a[index]<<endl;
}
else if (index==INVALID_INDEX)
{
cout<<"The element is not exist."<<endl;
}
/*for (int i=0;i<6;i++)
{
cout<<a[i]<<',';
}
cout<<endl;*/
system("pause");
}