九月四号《算法笔记》学习

1.归并排序(二路)

<1>递归实现

反复将[left,right]区间分为两半,对两个子区间[left,mid],[mid+1,right]分别递归进行归并排序,然后合并为有序序列。

const int maxn=100;
//合并两个子区间
void merge(int A[],int L1,int R1,int L2,int R2){
	int i=L1,j=L2;
	int temp[maxn],index=0;
	while(i<=R1&&j<=R2){
		if(A[i]<=A[j]){
			temp[index++]=A[i++];	
		}else{
			temp[undex++]=A[j++];	
		}
	}
	//将剩余元素加入序列中
	while(i<=R1) temp[index++]=A[i++];
	while(j<=R2) temp[index++]=A[j++];
	for(i=0;i<index;i++{
		A[L1+i]=temp[i];
	}
}
//将数组当前区间进行归并排序
void mergeSort(int A[],int left,int right){
	int mid=(left+right)/2;
	mergeSort(A,left,mid);
	mergeSort(A,mid+1,right);
	merge(A,left,mid,mid+1,right);
}

<2>非递归实现

令排序的区间长度初始step为2,将一组数据划分n个长度为step的区间,对每个区间进行排序,排序完一次就让step*2,直到step/2超过n,单侧区间大于整个长度结束。

void mergeSort(int A[]){
	for(int setp=2;step/2<=n;step*=2){
		for(int i=1;i<=n;i+=step){
			int mid=i+step/2-1;
			if(mid+1<=n){
			//右端点i+step-1算的时候可能会超过n
				merge(A,i,mid,mid+1,min(i+step-1.n));
			}
		}
	}
}

3.快速排序

//对区间划分
int Partition(int A[],int left,int right){
	int temp=A[left];
	while(left<right){
		while(left<right&&A[right]>temp) right--;
		A[left]=A[right];
		while(left<right&&A[left]<=temp) left++;
		A[right]=A[left];
	}
	A[left]=temp;
	return left;
}
void quickSort(int A[],int left,int right){
	if(left<right){
		int pos=Partition(A,left,right);
		quickSort(A,left,pos-1);
		quickSort(A,pos+1,right);
	}
}

4.随机数生成

srand((unsigned)time(NULL));
s=rand();
随机数生成有范围大小、
(int)(round(1.0*rand()/RAND_MAX *(b-a)+a)) 随机生成[a,b];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值