首页 > 代码库 > 稳定排序nlogn之归并排序_一维,二维
稳定排序nlogn之归并排序_一维,二维
稳定排序nlogn之归并排序_一维,二维
稳定排序:排序时间稳定的排序
稳定排序包括:归并排序(nlogn),基数排序【设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)) 】,冒泡排序(n^2),插入排序(n^2),交换排序(n^2),计数排序【n为数字个数,k为数字范围,O(n+k)】等。
Problem:对n个数进行排序,n<=100000,1s以内
正常来说我们都用qsort(c),sort(c++),但快速排序平均时间复杂度为nlogn,最坏时间复杂度为n^2。虽然c,c++中的快速排序经过优化(如随机化等),但是最坏时间复杂度仍然接近n^2……
Solution:
用归并排序,时间复杂度稳定在O(nlogn)。
n=10000 nlogn=132877
n=100000 nlogn=1660964
n=1000000 nlogn=19931568
其中2^10=1024,2^20=1024*1024约为1000000
Code:
一维和二维的区别在于数据类型的不同和比较方式的不同
一维:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define maxn 100000 4 5 struct node 6 { 7 long x,y; 8 }; 9 10 struct node a[maxn+1],b[maxn+1]; 11 12 void mergesort(long l,long r) 13 { 14 long mid; 15 mid=(l+r) >> 1; 16 if (l!=mid) mergesort(l,mid); 17 if (mid+1!=r) mergesort(mid+1,r); 18 long i,j,k; 19 for (i=l;i<=r;i++) 20 b[i]=a[i]; 21 i=l; 22 j=mid+1; 23 k=l; 24 while (i<=mid && j<=r) 25 { 26 if (b[i].x<b[j].x || (b[i].x==b[j].x && b[i].y<b[j].y)) 27 { 28 a[k]=b[i]; 29 i++; 30 k++; 31 } 32 else 33 { 34 a[k]=b[j]; 35 j++; 36 k++; 37 } 38 } 39 if (i<=mid) 40 { 41 while (i<=mid) 42 { 43 a[k]=b[i]; 44 i++; 45 k++; 46 } 47 } 48 else 49 { 50 while (j<=r) 51 { 52 a[k]=b[j]; 53 j++; 54 k++; 55 } 56 } 57 } 58 59 int main() 60 { 61 long n,i; 62 scanf("%ld",&n); 63 for (i=1;i<=n;i++) 64 scanf("%ld%ld",&a[i].x,&a[i].y); 65 mergesort(1,n); 66 printf("\n"); 67 for (i=1;i<=n;i++) 68 printf("%ld %ld\n",a[i].x,a[i].y); 69 printf("\n"); 70 return 0; 71 } 72 /* 73 5 74 1 2 75 2 3 76 2 1 77 1 5 78 3 3 79 */
二维:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define maxn 100000 4 5 struct node 6 { 7 long x,y; 8 }; 9 10 struct node a[maxn+1],b[maxn+1]; 11 12 void mergesort(long l,long r) 13 { 14 long mid; 15 mid=(l+r) >> 1; 16 if (l!=mid) mergesort(l,mid); 17 if (mid+1!=r) mergesort(mid+1,r); 18 long i,j,k; 19 for (i=l;i<=r;i++) 20 b[i]=a[i]; 21 i=l; 22 j=mid+1; 23 k=l; 24 while (i<=mid && j<=r) 25 { 26 if (b[i].x<b[j].x && (b[i].x==b[j].x && b[i].y<b[j].y)) 27 { 28 a[k]=b[i]; 29 i++; 30 k++; 31 } 32 else 33 { 34 a[k]=b[j]; 35 j++; 36 k++; 37 } 38 } 39 if (i<=mid) 40 { 41 while (i<=mid) 42 { 43 a[k]=b[i]; 44 i++; 45 k++; 46 } 47 } 48 else 49 { 50 while (j<=r) 51 { 52 a[k]=b[j]; 53 j++; 54 k++; 55 } 56 } 57 } 58 59 int main() 60 { 61 long n,i; 62 scanf("%ld",&n); 63 for (i=1;i<=n;i++) 64 scanf("%ld%ld",&a[i].x,&a[i].y); 65 mergesort(1,n); 66 printf("\n"); 67 for (i=1;i<=n;i++) 68 printf("%ld %ld\n",a[i].x,a[i].y); 69 printf("\n"); 70 return 0; 71 } 72 /* 73 5 74 1 2 75 2 3 76 2 1 77 1 5 78 3 3 79 */
稳定排序nlogn之归并排序_一维,二维
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。