zoukankan      html  css  js  c++  java
  • 八大排序算法总结

    插入排序

    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个keyword,每次针对一个keyword进行排序,然后针对排序后的序列进行下一个keyword的排序,循环至全部keyword都使用过则排序完毕。

    要点:对keyword的选取,元素分配收集。

    实现:

    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) //遍历全部keyword

    {

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

    {

    If(L[i]<m)

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

    Else

    Lsp=(L[i]/m)%10; //确定keyword

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

    n++;

    }

    CollectElement(L,Temp); //收集

    n=0;

    m=m*10;

    k++;

    }

    }

  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3833809.html
Copyright © 2011-2022 走看看