归并排序、插入排序、快速排序、二分查找的c++实现

由于一直希望能自主用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);
	}
}


3、快速排序

//快速排序子程序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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值