• 归并排序 && 快速排序


    归并排序:
    时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。空间复杂度为 O(n)
    归并排序比较占用内存,但却是一种效率高且稳定的算法。
    速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列
    具体思路是,在归并的过程中计算每个小区间的逆序对数,进而计算出大区间的逆序对数。
    归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.
     1 #include <cstdio>
     2 int cnt=0;
     3 int x1[50010],x2[50010];
     4 void Merge(int a[],int b[],int left,int middle,int right)
     5 {
     6     int i=left,j=middle+1,k=left;
     7     while(i!=middle+1&&j!=right+1)
     8     {
     9         if(a[i]<=a[j])
    10         {
    11             b[k++]=a[i++];
    12         }
    13         else
    14         {
    15             cnt+=middle-i+1;  //归并排序求逆序数  
    16             b[k++]=a[j++];
    17         }
    18        // printf("%d
    ",cnt);
    19     }
    20     while(i!=middle+1)
    21     {
    22         b[k++]=a[i++];
    23     }
    24     while(j!=right+1)
    25     {
    26         b[k++]=a[j++];
    27     }
    28     for(int i=left;i<=right;i++)
    29     {
    30         a[i]=b[i];
    31         //printf("%d ",a[i]);
    32     }
    33     //printf("
    ");
    34 }
    35 
    36 void Merge_sort(int a[],int b[],int left,int right)
    37 {
    38     int middle;
    39     if(left<right)
    40     {
    41         middle=(left+right)/2;
    42         //printf("%d %d %d
    ",left,right,middle);
    43         Merge_sort(a,b,left,middle);
    44         Merge_sort(a,b,middle+1,right);
    45         Merge(a,b,left,middle,right);
    46     }
    47     return;
    48 }
    49 
    50 int main()
    51 {
    52    // freopen("a.txt","r",stdin);
    53     int n;
    54     scanf("%d",&n);
    55     for(int i=0;i<n;i++)
    56     {
    57         scanf("%d",&x1[i]);
    58     }
    59     Merge_sort(x1,x2,0,n-1);
    60     printf("%d
    ",cnt);
    61     return 0;
    62 }

    快速排序:

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

     1 #include <cstdio>
     2 
     3 void qsort(int a[],int left,int right)
     4 {
     5     if(left>=right)  //完成一次 排序
     6     {
     7         return;
     8     }
     9     int key=a[left],i=left,j=right;
    10     while(i<j)
    11     {
    12         while(i<j&&key<=a[j])
    13         {   //从后往前查找 比key小的数丢到前面去
    14             j--;
    15         }
    16         a[i]=a[j];
    17         while(i<j&&key>=a[i])
    18         {   //从前往后查找 比key大的数丢到后面去
    19             i++;
    20         }
    21         a[j]=a[i];
    22     }
    23     a[i]=key;  //在key左边的都比key小,右边的都比key大
    24     qsort(a,left,i-1); //继续递归 直到 剩下一个数
    25     qsort(a,i+1,right);
    26 }
    27 int main()
    28 {
    29     int a[8]={23,10,34,5,9,39,84,77};
    30     qsort(a,0,7);
    31     for(int i=0;i<8;i++)
    32         printf("%d
    ",a[i]);
    33     return 0;
    34 }
  • 相关阅读:
    Android大牛
    在学习oauth时学到的
    using-jade-and-grunt-to-speed-up-html-production
    build-your-microservices-api-with-swagger
    json-web-token-apache-shiro
    WebSocket对象特性和方法
    芝麻教程
    how to export multiple SVG graphics in illustrator
    直播后台
    关于在chrome中响应不出现在XHR里的远影
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4586751.html
Copyright © 2020-2023  润新知