zoukankan      html  css  js  c++  java
  • 稳定排序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以内

     

    快速排序平均时间复杂度为nlogn,最坏时间复杂度为n^2。c,c++中的快速排序qsort(c),sort(c++)有优化(如随机化等),基本上达到O(nlogn),但是不是特别稳定。

     

    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 long a[maxn+1],b[maxn+1];
     6 
     7 void mergesort(long l,long r)
     8 {
     9     long mid;
    10     mid=(l+r) >> 1;
    11     if (l!=mid) mergesort(l,mid);
    12     if (mid+1!=r) mergesort(mid+1,r);
    13     long i,j,k;
    14     for (i=l;i<=r;i++)
    15         b[i]=a[i];
    16     i=l;
    17     j=mid+1;
    18     k=l;
    19     while (i<=mid && j<=r)
    20     {
    21         if (b[i]<b[j])
    22         {
    23             a[k]=b[i];
    24             i++;
    25             k++;
    26         }
    27         else
    28         {
    29             a[k]=b[j];
    30             j++;
    31             k++;
    32         }
    33     }
    34     if (i<=mid)
    35     {
    36         while (i<=mid)
    37         {
    38             a[k]=b[i];
    39             i++;
    40             k++;
    41         }
    42     }
    43     else
    44     {
    45         while (j<=r)
    46         {
    47             a[k]=b[j];
    48             j++;
    49             k++;
    50         }
    51     }
    52 }
    53 
    54 int main()
    55 {
    56     long n,i;
    57     scanf("%ld",&n);
    58     for (i=1;i<=n;i++)
    59         scanf("%ld",&a[i]);
    60     mergesort(1,n);
    61     printf("
    ");
    62     for (i=1;i<=n;i++)
    63         printf("%ld ",a[i]);
    64     printf("
    ");
    65     return 0;
    66 }
    67 /*
    68 5
    69 4 2 3 5 1
    70 */

     

    二维:

     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("
    ");
    67     for (i=1;i<=n;i++)
    68         printf("%ld %ld
    ",a[i].x,a[i].y);
    69     printf("
    ");
    70     return 0;
    71 }
    72 /*
    73 5
    74 1 2
    75 5 5
    76 4 4
    77 2 3
    78 2 2
    79 */
  • 相关阅读:
    小程序(四):模板
    小程序(三):授权登录
    小程序(二)
    小程序(一)
    从零开始学习微信小程序
    flex 弹性布局
    如何使用docker进行shadsocks环境开发配置
    eclipse 设置注释模板
    idea 2019.1.3最新注册码
    centos7安装rabbitmq简单方式
  • 原文地址:https://www.cnblogs.com/cmyg/p/6918999.html
Copyright © 2011-2022 走看看