2021-08-31C++实现各种排序算法

想想还是大一下学期热衷算法时写的(现是应届毕业生了)

快速排序:(核心值分大小法)

基本思想:
取一个核心值,如下的算法是以每次排序序列的最后一位作为核心值,以核心值分成比和核心值大的部分和比核心值小的部分
如:序列:1 0 44 2 3
第一次调用priority,核心值x为3,p初始为left即为0

  1. 1比3小,i=0,p=1
  2. 0比3小,i=1,p=2
  3. 44比3大,i=2,p=2
  4. 2比3小,i=3,此时A[i]=2<A[p]=44,将他们换位置,即变成 1 0 2 44 3 此时p=3
  5. 跳出循环,将A[p]和核心值换(也可以理解将核心值插进比他小和比他大的值中间)即序列变为1 0 2 3 44
  6. 后面将核心值3的左边和右边同上边进行排序

其实快速排序就是将下标当为标志进行排序,可见上面p为多少即有多少个值小于核心值,将他们放在左边,如果从大排到小也就是将大于核心值的放左边,小于核心值的放右边,可自己尝试

int priority(int *A,int left,int right)
{
	int x,t;   
	x=A[right];//x表示核心比较值,以最右的数据作为核心比较值 
	int p,i;
	p=left;
	for(i=left;i<right;i++)
	{
		if(A[i]<x)//如果小于核心比较值x,即将p位置加一 
		{
			if(A[i]<A[p])//如果过程中有小于p位置的就进行调换,说明此时的p位置的是大于x的 
			{
				t=A[i];
				A[i]=A[p];
				A[p]=t; 
			} 
			p++;
		}
	}
	//将核心值和对应的p所在位置的值交换
	t=A[p];A[p]=A[right];A[right]=t;
	return p; 
}
void qsort(int *A,int left,int right)
{
	if(left>right)return ;
	int p;
	p=priority(A,left,right);
	qsort(A,left,p-1);
	qsort(A,p+1,right);
	
}

插入排序:(插入值法)

效率比较慢

  1. 如序列1 0 44 2 3
  2. 将数组遍历一遍
  3. 先从1开始,由于前面都没值,往下走
  4. i=1,即为0,此时的j=0时对应1,没有值比0小,即j为0,跳出第一个循环,1比0大,将数值0插入j的位置(代码把数值0的位置腾空,把j=0开始的数往后移动)此时序列变为0 1 44 2 3
  5. i=2,即数值44,不需要往前插
  6. 2比44小,0 1 比2小,即j=2,把从j=2开始到j=i-1=2的数值:即44往后移动,即序列变为:0 1 2 44 3
  7. 最后把3往前插即为0 1 2 3 44
//插入排序
void insertsort(int*A,int n)
{
	int i,j,x,k;
	for(i=0;i<n;i++)
	{
		j=0;
		while(j<i&&A[j]<A[i])//比i位置小的数据不管 
		{
			j++;
		}
		if(i!=j)//发现比i大的数据,前面都是有序的了 
		{
			x=A[i];
			k=i;
			while(k>j)//将i位置腾空,将j后面的数字全部往后移,j腾空给i放 
			{
				A[k]=A[k-1];
				k--;
			}
			A[j]=x;
		}
	}
 } 

归并排序

(分而治之)(再开一个数组进行存储)

void msort(int*A,int left,int m,int right,int *temp)
{
	int i=left;
	int j=m+1;
	int t=0;
	while(i<=m&&j<=right)
	{
			if(A[i]<=A[j])
	       {
		    temp[t++]=A[i++];
	        }else{
	        	temp[t++]=A[j++];
			}
	}
	while(i<=m)
	{
		temp[t++]=A[i++];
	}
	while(j<=right)
	{
		temp[t++]=A[j++];
	}
	for(i=left;i<=right;i++)
	{
		A[i]=temp[i];
	}
} 
void addsort(int *A,int left,int right,int *temp)
{
	if(right>left)
	{
		int m=(left+right)/2;
		addsort(A,left,m,temp);//左归并排序 
		addsort(A,m+1,right,temp);//有归并排序
		msort(A,left,m,right,temp);//左右序列归并排序 
	}
}

希尔排序

void xiersort(int *A,int n)
{
	int i,j,d,x,k;
	for(d=n/2;d>0;d/=2)//增量每次变为一半 
	{
		for(i=d;i<n;i++)//插入算法 
		{
			x=A[i];
			for(j=i;A[j-d]>x&&j>=d;j-=d) 
			A[j]=A[j-d];
			A[j]=x;
		 } 
	}
 } 

在此插入二分查找

int  binarysort(int *A,int left,int right,int k)
 {
 	int m=(right+left)/2;
 	if(A[m]==k)return m;
 	if(A[m]>k){
 		return binarysort(A,left,m-1,k);
	 }
	 if(A[m]<k){
	 	return binarysort(A,m+1,right,k);
	 }
  } 

完整代码:(可运行)

#include<iostream>
using namespace std;
const int maxn=1e5;
//快速排序 
int priority(int *A,int left,int right)
{
	int x,t;   
	x=A[right];//x表示核心比较值,以最右的数据作为核心比较值 
	int p,i;
	p=left;
	for(i=left;i<right;i++)
	{
		if(A[i]<x)//如果小于核心比较值x,即将p位置加一 
		{
			if(A[i]<A[p])//如果过程中有小于p位置的就进行调换,说明此时的p位置的是大于x的 
			{
				t=A[i];
				A[i]=A[p];
				A[p]=t; 
			} 
			p++;
		}
	}
	//将核心值和对应的p所在位置的值交换
	t=A[p];A[p]=A[right];A[right]=t;
	return p; 
}
void qsort(int *A,int left,int right)
{
	if(left>right)return ;
	int p;
	p=priority(A,left,right);
	qsort(A,left,p-1);
	qsort(A,p+1,right);
	
}
//插入排序
void insertsort(int*A,int n)
{
	int i,j,x,k;
	for(i=0;i<n;i++)
	{
		j=0;
		while(j<i&&A[j]<A[i])//比i位置小的数据不管 
		{
			j++;
		}
		if(i!=j)//发现比i大的数据,前面都是有序的了 
		{
			x=A[i];
			k=i;
			while(k>j)//将i位置腾空,将j后面的数字全部往后移,j腾空给i放 
			{
				A[k]=A[k-1];
				k--;
			}
			A[j]=x;
		}
	}
 } 
//归并排序(分而治之)(再开一个数组进行存储) 
void msort(int*A,int left,int m,int right,int *temp)
{
	int i=left;
	int j=m+1;
	int t=0;
	while(i<=m&&j<=right)
	{
			if(A[i]<=A[j])
	       {
		    temp[t++]=A[i++];
	        }else{
	        	temp[t++]=A[j++];
			}
	}
	while(i<=m)
	{
		temp[t++]=A[i++];
	}
	while(j<=right)
	{
		temp[t++]=A[j++];
	}
	for(i=left;i<=right;i++)
	{
		A[i]=temp[i];
	}
} 
void addsort(int *A,int left,int right,int *temp)
{
	if(right>left)
	{
		int m=(left+right)/2;
		addsort(A,left,m,temp);//左归并排序 
		addsort(A,m+1,right,temp);//有归并排序
		msort(A,left,m,right,temp);//左右序列归并排序 
	}
}
//希尔排序

void xiersort(int *A,int n)
{
	int i,j,d,x,k;
	for(d=n/2;d>0;d/=2)//增量每次变为一半 
	{
		for(i=d;i<n;i++)//插入算法 
		{
			x=A[i];
			for(j=i;A[j-d]>x&&j>=d;j-=d) 
			A[j]=A[j-d];
			A[j]=x;
		 } 
	}
 } 
//堆排序

 


//二分查找 
int  binarysort(int *A,int left,int right,int k)
 {
 	int m=(right+left)/2;
 	if(A[m]==k)return m;
 	if(A[m]>k){
 		return binarysort(A,left,m-1,k);
	 }
	 if(A[m]<k){
	 	return binarysort(A,m+1,right,k);
	 }
  } 
int main()
{
	int A[maxn],n,i,x,y;
	printf("请输入数组个数:"); 
	scanf("%d",&n);
	printf("请输入数组:\n"); 
	for(i=0;i<n;i++)
	scanf("%d",&A[i]);;
	printf("请输入数字选择排序方式1.快速排序 2.插入排序 3.归并排序 4.希尔算法\n");
	scanf("%d",&y);
	if(y==1)qsort(A,0,n-1);
	else if(y==2)insertsort(A,n);
	else if(y==3){int temp[maxn];addsort(A,0,n-1,temp);}
	else if(y==4)xiersort(A,n); 
	
	printf("排序后数组如下:\n"); 
	for(i=0;i<n;i++)
	printf("%d ",A[i]);
	printf("\n");
	printf("请输入查找的数:"); 
	scanf("%d",&x);
	printf("第%d位为%d\n",binarysort(A,0,n-1,x)+1,x);
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值