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];