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