插入排序 and 选择排序
Posted 一个敲代码的阿信
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序 and 选择排序相关的知识,希望对你有一定的参考价值。
插入排序
实现逻辑
左侧为已排序区,右侧为未排序区。每次取未排序区的第一个元素与已排序区的每一个元素对比(从后往前),找到合适位置则将插入,其他元素后移
复杂度
最好 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 选择排序的主要内容,如果未能解决你的问题,请参考以下文章
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚