算法——插入排序与选择排序

本文介绍了插入排序和选择排序。插入排序包含直接插入排序和希尔排序,直接插入排序将待排序记录插入有序序列,元素越接近有序效率越高;希尔排序是其优化版。选择排序每次选最小或最大元素放起始位置,效率不佳。还给出了各排序的复杂度和稳定性。

一、插入排序
<1>、直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一
个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列
思想十分简单,算法实现如下:

 //直接插入排序  越有序插入越快
    //将每一个数与前面所有排好序的数字相比较,如果大了  直接放入即可
    public static void insertSort(int[] array){
        for(int i=0;i<array.length;i++){
            int tmp=array[i];
           int j=0;
           for(j=i-1;j>=0;j--){
               if(array[j]>array[i]){
                   array[i]=array[j];
                   array[j]=tmp;
               }
           }
            }
    }

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定
    <2>、希尔排序
    希尔排序是优化过后的直接插入排序,大致图解如下
    在这里插入图片描述
    具体算法实现:
  //哈希排序  按组数分批次排序  是直接插入的优化
    public  static void shell(int[] array,int gap){//进行一趟排序
        for(int i=0;i<array.length;i+=gap){
            int tmp=array[i];
            int j=0;
            for(j=i-1;j>=0;j-=gap){
                if(array[j]>array[i]){
                    array[i]=array[j];
                    array[j]=tmp;
                }
            }
        }
    }
    public static void shellSort(int[] array){
        int[] drr = {5,3,1};
        for (int i = 0; i < drr.length; i++) {//分三趟
            shell(array,drr[i]);
        }
    }

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就
    会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
  4. 稳定性:不稳定
    二、选择排序
    选择排序是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的
    数据元素排完。
    大致图解如下:

在这里插入图片描述
与直接插入算法其实很类似且十分简单容易理解,算法实现如下:

   public static void selectSort(int[] array){
        for(int i=0;i<array.length;i++){
            int tmp=array[i];
            for(int j=i+1;j<array.length;j++){
                if(array[j]<array[i]){
                    array[i]=array[j];
                    array[j]=tmp;
                }
            }
        }
    }

直接选择排序的特性总结
6. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
7. 时间复杂度:O(N^2)
8. 空间复杂度:O(1)
9. 稳定性:不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值