6大排序算法总结

6大排序算法—老生常谈的问题,我却不精通

   很遗憾虽然排序算法作为最基本的算法,然而我自以为我也会这种算法,但是我忽略的一个事实,我只知道这种算法的思想,真正实现或者使用的次数却屈指可数。但是我一直认为我是会的……,直到有一天,有人给我一张纸说,来写个快排吧,

于是有了这篇排序算法总结

  • 选择排序
    核心思想是每次从剩余的数中选择最小或最大的数,核心操作是需要一个变量来存储,每一次更新过程,最后返回找到的最小(大)的数下标,然后把这个数和应该放在某个位置上原有的数进行交换
public  void selection(int [] a){
  int N=a.length;
  for(int i=0;i<N;i++){
        int min=i;
        for(int j=i+1;j<N;j++){
            if(a[j]<a[min]){
                min=j;
            }
        }
        swap(a[i],a[min]);
    }
}
  • 插入排序
    核心思想:每次插入一个数据前,数组是有序的,只需要把数据插在有序的数组的部分位置。
public void insertion(int[] a){
    int N=a.length;
    for(int i=1;i<N;i++){
        for(int j=i;j>0&&a[j]<a[j-1];j--){
            swap(a[j],a[j-1]);
        }
    }
}
  • 希尔排序
    核心思想:希尔排序是插入排序的改进版,插入排序中,每次一个数据只能和临近位置的数据交换,换句话说,每次一个数据只能移动一个位置,如果一个最小的数在数组最后,那么他需要执行N-1次交换。
    希尔排序利用散列的思想,创造h路独立的插入排序,这样当h很大时,会增大数据一次可以移动的距离,这样当随着h减小时,这将有利于h小的插入排序(减少移动交换次数),最后h取1 ,就是一个插入排序。
public void shellsort(int [] a){
    int N=a.length;
    int h=1;
    while(h<N/3){
        h=h*3+1;
    }
    while(h>=1){
        for(int i=h;i<N;i++){
            for(int j=i;j>=h&&a[j]<a[j-h];j-=h){
            swap(a[j],a[j-h])
            }
        }
        h=h/3;
    }
}
  • 归并排序

  • 快速排序

    • 3路快排
  • 堆排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值