插入排序 and 选择排序

Posted 一个敲代码的阿信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序 and 选择排序相关的知识,希望对你有一定的参考价值。

jack原创
第16篇


插入排序


实现逻辑

左侧为已排序区,右侧为未排序区。每次取未排序区的第一个元素与已排序区的每一个元素对比(从后往前),找到合适位置则将插入,其他元素后移


复杂度

最好 O(n)

最坏 O(n^2)

平均 O(n^2)


原地排序,稳定排序

 

代码

public static void sort(int[] arr){        

    if (arr.length < 2) return  ; //如果数组长度小于2,则直接返回        for (int i=1;i<arr.length;++i){            

            int j = i - 1 ;            

            int value = arr[i];            

            for(;j>=0;--j){                

                if (arr[j]>value)arr[j+1]=arr[j];//如果未排序区元素a大于已排序区元素b则b后移一位                else break;            }            arr[j+1]=value;//因为在for循环的最后一次判断中已经-1了,所以需要加上1        }    }


测试



选择排序


实现逻辑

左侧为已排序区,右侧为未排序区。每次从未排序区中选出一个最小的元素,然后与未排序去的第一个元素交换位置


复杂度

最好 O(n^2)

最坏 O(n^2)

平均 O(n^2)


原地排序,非稳定排序


代码

public static void selectionSort2(int[] arr,int n ){        
   for (int i = 0;i<n;++i){            
       int lowPosition = i;   //未排序区最小元素的位置        boolean isSort = true; //是否有序的标示        for (int j=i;j<n;++j){                
           if (arr[j]<arr[lowPosition]){                    lowPosition=j;                    isSort = false;                }            }            
           //未排序区的最小元素位置与未排序区的第一个元素交换位置            if (lowPosition != i){                
               int temp = arr[i];                arr[i]=arr[lowPosition];                arr[lowPosition]=temp;            }            
           if (isSort)break;//如果没有发生元素交换位置的情况则说明有序,直接跳出即可        }    }


测试









以上是关于插入排序 and 选择排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡选择插入排序(Java)

插入排序

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚

《算法》笔记 3 - 选择排序插入排序希尔排序

排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

三大基础排序算法(冒泡排序,选择排序,插入排序)