数据结构(C语言)—— -2分治:分治排序

趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~

分治排序:

#include<stdio.h>

const int maxn=1000001;
int A[maxn];

void merge(int arr[], int left, int middle, int right){
	int i,j;
	int n1=midle-left+1,n2=right-middle;
	int L1[n1],L2[n2];
	for(i=0;i<n1;i++){
		L1[i]=arr[left+i];
	}
	for(j=0;j<n2;j++){
		L2[j]=arr[middle+j+1];
	}
	i=j=0;
	int k=left;
	while(i<n1&&j<n2){
		if(L1[i]<=L2[j]){
			arr[k++]=L1[i++];
		}
		else{
			arr[k++]=L2[j++];
		}
	}
	while(i<n1){
		arr[k++]=L1[i++];
	}
	while(j<n2){
		arr[k++]=L2[j++];
	}
}

void mergesort(int arr[],int left, int right){
	if(left<right){
		int middle=(right+left)/2;
		mergesort(arr,left,middle);
		mergesort(arr,middle+1,right);
		merge(arr,left,middle,right);
	}
}

 int main() {
 	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d", &A[i]);
	mergesort(A,0,n-1);
	for(int i=0;i<n;i++) printf("%d ", A[i]);
} 

不断将数组分成两部分,最后直到不可以再分的时候,再将数组合并,合并的操作和有序表取并比较类似,但是重复元素也要,可以看我之前的博客。

时间复杂度是O(nlgn)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值