• 排序


    稳定性

    内部排序,内存,逐步扩大有序记录

    外部排序

    排序过程的依据不同原理:插入,交换,选择,归并,基数o(d.n)

    插入类,交换类,选择类,归并

    插入类:在R[1...I-1].KEY<=R【i】。key<R[j+1.........i-1].key;

    将R【j+1。。。。。i-1】中的所有记录·后移一个位置;

    将R【】插入(复制)到R

    排序算法评价时间开销和空间开销

    时间还与最好,最坏

    直接插入排序:最好的情况是比较次数n-1,移动次数为0次

    最坏情况:·递减有序比较次数(n+2)(n-1)/2

    移动次数(n+4)(n-1)/2

    顺序插入排序

    折半插入排序

    for(i=2;i<=length;i++){

    for(i=2;i<=L.length;++i){

    Lr[0]=L.r[i];//将L。r[i]暂存在L。r[0]

    在L。r[1.....i-1]中折半查找插入位置(high+1);

    for(j=i-1;j<high+1;--j)

    L.r[j+1]=L..r[j]

    L.R【high+1】=L。r【0】;

    low=1;high=i-1;

    while(low<=high)

    {

    m=(low<=high){

    m=(low+high)/2

    if(L.R[0].KEY<L.R[M].KEY)

    HIGH=m-1;

    else low=m+1;

    }

    }

    }

    }

    希尔排序

    void shellInset(Sqlist&L,int dk)

    for(i=dk+1;i<=n;++i)

    if(L.r[i].key<L.r[i-dk].key){

    L.r[0]=L.r[i];

    for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk)

    L.r[j+dk]=L.r[j];

    L.r[j+dk]=L.r[0];

    }

    shellinsert

    for(k=0;k<t;++k)

      shellinsert(L,dlta[k])

    对待排序先宏观后微观

    将个记录分成d个子序列

    表插入排序

    交换排序包含冒泡排序和快排

    void bubblesort(Elem R[],int n)

    {

    for(i=1;i<n;i++)

      for(j=1;j<=n-j:j++)

    if(R[j].key>R[j+1].key)

         {Swap(R[j],R[j+1]}

    }

    }

    改进版本

    void bubblesort(Elem R[],int n){

    i=n;flag=1;

    while((i>1)&&flag){

    flag=0;

    for(j=1;j<i:)

    }

    }

    优化

    记住本趟最后一个以后都是有序的

    冒泡排序的最好比较次数n-1,移动

    最坏次数是移动3n

    快排:

    枢轴52,49,80,36,14,58,61,97,23,75

    23,49,14,36,52,58,61,97,80,75

     1 int Partition(RedType &R[],int low,int high)
     2 pivotkey =R[low].key;
     3 while(low<high){
     4   while(low<high&&R[high].key>=pivotkey)
     5   --high;
     6  R[low]<-->R[high];
     7  while(low<high&&R[low].key<=pivotkey)
     8 ++low;
     9 }
    10 return low;//返回枢轴所在位置
    11 }
    12 
    13 
    14 
    15 
    16 }

    时间复杂度o(nlogn)

    如果初始状态是按关键字有序为o(n^2)

    选择排序

    简单选择排序

    无序序列中找到最小的放到ai

     1 void SelectSort(Elem R[],int n)
     2 
     3 {
     4 //对记录序列R【1.。。n】做简单选择排序
     5 for(i=1;i<n;++i){
     6 //选择第i小的记录,并交换到位
     7 j=SelectMinKey(R,i);
     8 //在R【i。。。n】中选择关键字最小的记录
     9 if(i!=j)R[i]<-->R[j];
    10 /与第i个记录交换
    11 }
    12 
    13 
    14 }

    对n个记录进行比较次数n(n-1)/2

    移动最少0,最多3(n-1)

    树形选择排序

    从根到顶,将最小的改成正无穷

    时间复杂度nlogn

    空间复杂度增加

    堆排序

    堆的定义:
    小顶堆大顶堆

    左右子孩子都小于根是大顶堆。

    堆顶元素是最大值(大顶堆)

    堆排序无论最坏最好时间复杂度都为nlogn

    归并排序

    将两个或两个以上的有序子序列归并为一个有序

    1 void Merge(RcdType SR[],RcdType&TR[],int i,int m,int n)
    2 for(j=m+1,k=i;i<=m&&j<=n;++k)
    3 {
    4 if(SR[i]。key《=SR[j]。key) TR[K]=SR[i++];
    5 else TR[K]=SR[j++];
    6 }
    7 ...
    8 }

    将剩余的SR[I...M]复制到TR

    将剩余的SR【j...n】复制到TR

    if(i<=m)TR[K...N]=SR[i....m];
    if(j<=n)TR[K....N]=SR[j..n];

    2路归并

    第一趟、

    时间复杂度o(NLogn)空间O(N)

    基数排序

    链式基数排序(分配收集)分别按各位,十位百位排序,是稳定的

    比较的多个关键字MSD或者LSD

    数字0-9

    ,

    当一个男人不再对你啰嗦,不再缠着你,不再没事找你,对你说话也客气了,也不再气你了。那么恭喜你,你已经成功的失去了他。别嫌弃男人幼稚,那是他喜欢你,爱你。女人说男人像小孩子一样不成熟,可又有谁知道,男人在自己喜欢的女人面前才像小孩子,如果不喜欢你了,不爱你了,他比你爸还成熟。
  • 相关阅读:
    ubuntu安装Elasticsearch
    PHP如何计算脚本执行时间
    MVC+EF中返回JSON的性能和安全问题
    博客园最新的一个模板样式有问题
    Entity Framework 批量插入很慢吗?我自己测试下
    用 Raphaël 绘制中国地图 + 显示数据
    博客园的手机版(非官方) MVC+jQuery.Mobile
    BitCovert,与移位,加法性能比较
    探讨微软ASP.NET AJAX控件开发技术(客户端)
    (十三)树【C++刷题】
  • 原文地址:https://www.cnblogs.com/fengtangjiang/p/11464940.html
Copyright © 2020-2023  润新知