1. 程式人生 > >穩定排序nlogn之歸並排序_一維,二維

穩定排序nlogn之歸並排序_一維,二維

不同 lib 交換 void oid span cnblogs int !=

穩定排序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之歸並排序_一維,二維