• 八大排序算法总结


    插入排序

    1.直接插入排序

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

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

    实现:

    Void InsertSort(Node L[],int length)

    {

    Int i,j;//分别为有序区和无序区指针

    for(i=1;i<length;i++)//逐步扩大有序区

    {

    j=i+1;

    if(L[j]<L[i])

    {

    L[0]=L[j];//存储待排序元素

    While(L[0]<L[i])//查找在有序区中的插入位置,同时移动元素

    {

    L[i+1]=L[i];//移动

    i--;//查找

    }

    L[i+1]=L[0];//将元素插入

    }

    i=j-1;//还原有序区指针

    }

    }

    2.希尔排序

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

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

    实现:

    Void shellSort(Node L[],int d)

    {

    While(d>=1)//直到增量缩小为1

    {

    Shell(L,d);

    d=d/2;//缩小增量

    }

    }

    Void Shell(Node L[],int d)

    {

    Int i,j;

    For(i=d+1;i<length;i++)

    {

    if(L[i]<L[i-d])

    {

    L[0]=L[i];

    j=i-d;

    While(j>0&&L[j]>L[0])

    {

    L[j+d]=L[j];//移动

    j=j-d;//查找

    }

    L[j+d]=L[0];

    }

    }

    }

    交换排序

    1.冒泡排序

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

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

    实现:

    Void BubbleSort(Node L[])

    {

    Int i ,j;

    Bool ischanged;//设计跳出条件

    For(j=n;j<0;j--)

    {

    ischanged =false;

    For(i=0;i<j;i++)

    {

    If(L[i]>L[i+1])//如果发现较重元素就向后移动

    {

    Int temp=L[i];

    L[i]=L[i+1];

    L[i+1]=temp;

    Ischanged =true;

    }

    }

    If(!ischanged)//若没有移动则说明序列已经有序,直接跳出

    Break;

    }

    }

    2.快速排序

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

    要点:递归、分治

    实现:

     

    选择排序

    1.直接选择排序

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

    要点:

    实现:

    Void SelectSort(Node L[])

    {

    Int i,j,k;//分别为有序区,无序区,无序区最小元素指针

    For(i=0;i<length;i++)

    {

    k=i;

    For(j=i+1;j<length;j++)

    {

    If(L[j]<L[k])

    k=j;

    }

    If(k!=i)//若发现最小元素,则移动到有序区

    {

    Int temp=L[k];

    L[k]=L[i];

    L[i]=L[temp];

    }

     

    }

    }

    2.堆排序

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

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

    实现:

    Void HeapSort(Node L[])

    {

    BuildingHeap(L);//建堆(大根堆)

    For(int i=n;i>0;i--)//交换

    {

    Int temp=L[i];

    L[i]=L[0];

    L[0]=temp;

    Heapify(L,0,i);//调整堆

    }

    }

     

    Void BuildingHeap(Node L[])

    { For(i=length/2 -1;i>0;i--)

    Heapify(L,i,length);

    }

    归并排序

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

    要点:归并、分治

    实现:

    Void MergeSort(Node L[],int m,int n)

    {

    Int k;

    If(m<n)

    {

    K=(m+n)/2;

    MergeSort(L,m,k);

    MergeSort(L,k+1,n);

    Merge(L,m,k,n);

    }

    }

     

    基数排序

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

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

    实现:

    Void RadixSort(Node L[],length,maxradix)

    {

    Int m,n,k,lsp;

    k=1;m=1;

    Int temp[10][length-1];

    Empty(temp); //清空临时空间

    While(k<maxradix) //遍历所有关键字

    {

    For(int i=0;i<length;i++) //分配过程

    {

    If(L[i]<m)

    Temp[0][n]=L[i];

    Else

    Lsp=(L[i]/m)%10; //确定关键字

    Temp[lsp][n]=L[i];

    n++;

    }

    CollectElement(L,Temp); //收集

    n=0;

    m=m*10;

    k++;

    }

    }

    出自:http://blog.csdn.net/yexinghai/article/details/4649923

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/mfryf/p/3104228.html
Copyright © 2020-2023  润新知