• 各种排序算法大汇总☆WM☆


    技术类岗位笔试面试中排序算法是永远的话题,先整理如下 :

    八大排序算法
    插入排序:
    1.直接插入排序

    原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。

    要点:设立哨兵,作为临时存储和判断数组边界之用。

    实现:

     1 Void InsertSort(Node L[],int length)
     2 {
     3 
     4     Int i,j;//分别为有序区和无序区指针
     5 
     6     for(i=1;i<length;i++)//逐步扩大有序区
     7 
     8     {
     9 
    10         j=i+1;
    11 
    12         if(L[j]<L[i])
    13 
    14         {
    15 
    16             L[0]=L[j];//存储待排序元素
    17 
    18             While(L[0]<L[i])//查找在有序区中的插入位置,同时移动元素
    19 
    20             {
    21 
    22                 L[i+1]=L[i];//移动
    23 
    24                 i--;//查找
    25 
    26             }
    27 
    28             L[i+1]=L[0];//将元素插入
    29 
    30         }
    31 
    32         i=j-1;//还原有序区指针
    33 
    34     }
    35 
    36 }

    2.希尔排序

    原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。

    要点:增量的选择以及排序最终以1为增量进行排序结束。

    实现:

     1 Void shellSort(Node L[],int d)
     2 
     3 {
     4 
     5     While(d>=1)//直到增量缩小为1
     6 
     7     {
     8 
     9         Shell(L,d);
    10 
    11         d=d/2;//缩小增量
    12 
    13     }
    14 
    15 }
    16 
    17 Void Shell(Node L[],int d)
    18 
    19 {
    20 
    21     Int i,j;
    22 
    23     For(i=d+1;i<length;i++)
    24 
    25     {
    26 
    27         if(L[i]<L[i-d])
    28 
    29         {
    30 
    31             L[0]=L[i];
    32 
    33             j=i-d;
    34 
    35             While(j>0&&L[j]>L[0])
    36 
    37             {
    38 
    39                 L[j+d]=L[j];//移动
    40 
    41                 j=j-d;//查找
    42 
    43             }
    44 
    45             L[j+d]=L[0];
    46 
    47         }
    48 
    49     }
    50 
    51 }

    交换排序:

    1.冒泡排序

    原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。

    要点:设计交换判断条件,提前结束以排好序的序列循环。

    实现:

     1 Void BubbleSort(Node L[])
     2 
     3 {
     4 
     5     Int i ,j;
     6 
     7     Bool ischanged;//设计跳出条件
     8 
     9     For(j=n;j<0;j--)
    10 
    11     {
    12 
    13         ischanged =false;
    14 
    15         For(i=0;i<j;i++)
    16 
    17         {
    18 
    19             If(L[i]>L[i+1])//如果发现较重元素就向后移动
    20 
    21             {
    22 
    23                 Int temp=L[i];
    24 
    25                 L[i]=L[i+1];
    26 
    27                 L[i+1]=temp;
    28 
    29                 Ischanged =true;
    30 
    31             }
    32 
    33         }
    34 
    35         If(!ischanged)//若没有移动则说明序列已经有序,直接跳出
    36 
    37             Break;
    38 
    39     }
    40 
    41 }
    2.快速排序

    原理:不断寻找一个序列的中点,然后对中点左右的序列递归的进行排序,直至全部序列排序完成,使用了分治的思想。

    要点:递归、分治

    实现:




    选择排序:

    1.直接选择排序

    原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。

    要点:

    实现:

     1 Void SelectSort(Node L[])
     2 
     3 {
     4 
     5     Int i,j,k;//分别为有序区,无序区,无序区最小元素指针
     6 
     7     For(i=0;i<length;i++)
     8 
     9     {
    10 
    11         k=i;
    12 
    13         For(j=i+1;j<length;j++)
    14 
    15         {
    16 
    17             If(L[j]<L[k])
    18 
    19                 k=j;
    20 
    21         }
    22 
    23         If(k!=i)//若发现最小元素,则移动到有序区
    24 
    25         {
    26 
    27             Int temp=L[k];
    28 
    29             L[k]=L[i];
    30 
    31             L[i]=L[temp];
    32 
    33         }
    34 
    35 
    36 
    37     }
    38 
    39 }

    2.堆排序

    原理:利用大根堆或小根堆思想,首先建立堆,然后将堆首与堆尾交换,堆尾之后为有序区。

    要点:建堆、交换、调整堆

    实现:

     1 Void HeapSort(Node L[])
     2 
     3 {
     4 
     5     BuildingHeap(L);//建堆(大根堆)
     6 
     7     For(int i=n;i>0;i--)//交换
     8 
     9     {
    10 
    11         Int temp=L[i];
    12 
    13         L[i]=L[0];
    14 
    15         L[0]=temp;
    16 
    17         Heapify(L,0,i);//调整堆
    18 
    19     }
    20 
    21 }
    22 
    23 
    24 
    25 
    26 Void BuildingHeap(Node L[])
    27 
    28 { For(i=length/2 -1;i>0;i--)
    29 
    30 Heapify(L,i,length);
    31 
    32 }
    归并排序:

    原理:将原序列划分为有序的两个序列,然后利用归并算法进行合并,合并之后即为有序序列。

    要点:归并、分治

    实现:

     1 Void MergeSort(Node L[],int m,int n)
     2 
     3 {
     4 
     5     Int k;
     6 
     7     If(m<n)
     8 
     9     {
    10 
    11         K=(m+n)/2;
    12 
    13         MergeSort(L,m,k);
    14 
    15         MergeSort(L,k+1,n);
    16 
    17         Merge(L,m,k,n);
    18 
    19     }
    20 
    21 }



    基数排序:

    原理:将数字按位数划分出n个关键字,每次针对一个关键字进行排序,然后针对排序后的序列进行下一个关键字的排序,循环至所有关键字都使用过则排序完成。

    要点:对关键字的选取,元素分配收集。

    实现:

     1 Void RadixSort(Node L[],length,maxradix)
     2 
     3 {
     4 
     5     Int m,n,k,lsp;
     6 
     7     k=1;m=1;
     8 
     9     Int temp[10][length-1];
    10 
    11     Empty(temp); //清空临时空间
    12 
    13     While(k<maxradix) //遍历所有关键字
    14 
    15     {
    16 
    17         For(int i=0;i<length;i++) //分配过程
    18 
    19         { 
    20 
    21             If(L[i]<m)
    22 
    23                 Temp[0][n]=L[i];
    24 
    25             Else
    26 
    27                 Lsp=(L[i]/m)%10//确定关键字
    28 
    29             Temp[lsp][n]=L[i];
    30 
    31             n++;
    32 
    33         }
    34 
    35         CollectElement(L,Temp); //收集
    36 
    37         n=0;
    38 
    39         m=m*10;
    40 
    41         k++;
    42 
    43     }
    44 }

    作者:W.M.steve
    出处:http://www.cnblogs.com/weisteve/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    IDE 集成开发环境
    工匠若水 Android应用开发编译框架流程与IDE及Gradle概要
    史上最详细的Android Studio系列教程四--Gradle基础
    织梦首页怎么调用栏目下的文章列表
    html dl dt dd标签元素语法结构与使用
    a标签的link、visited、hover、active的顺序
    CSS3之border-radius圆角
    网页右键无法使用网站右键被禁止破解 利用火狐
    WEBZIP为什么打不开网页
    4种常用扒站工具(webzip、ha_TeleportPro、Offline Explorer、wget)
  • 原文地址:https://www.cnblogs.com/weisteve/p/2205189.html
Copyright © 2020-2023  润新知