概念:
插入排序(inertion Sort)一般也被称为直接插入排序,是一种简单的直观的排序算法
工作原理:将待排列元素划分为(已排序)和(未排序)两部分,每次从(未排序的)元素选择一个插入到(已排序的)元素中的正确位置,这个位置类似于平时打扑克牌摸牌的操作,右手摸牌,根据牌面的大小放到左手边正确的位置上
具体实现:使用双层循环,外层循环枚举除了第一个元素之外的所有元素,内层循环遍历当前元素前面的有序表,进行待插入位置查找,并进行移动
public void insertSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
for (int i = 1; i < arr.length; i++) { // 待插入元素的索引
int insertEle = arr[i];//对待插入元素进行保存
int j = i - 1;
//有序区中存在多少个元素就需要遍历多少次
for (; j >= 0; j--){
if (arr[j] >= insertEle) {
arr[j + 1] = arr[j];
} else {
break;
}
}
//直到找到有序区第一个比待插入元素小的位置,然后在j+1上添加元素
arr[j + 1] = insertEle;
}
}
leetcode题:
删除某些元素后的数组均值
class Solution {
public double trimMean(int[] arr) {
if(arr==null||arr.length==0){
return 0;
}
Arrays.sort(arr);
int count= arr.length/20;
double sum=0;
for (int i =count; i < arr.length-count; i++) {
sum+=arr[i];
}
return sum/(arr.length-2*count);
}
}
去掉最低工资和最高工资后的平均工资
class Solution {
public double average(int[] salary) {
insertSort(salary);
double sum=0;
for(int i=1;i<salary.length-1;i++){
sum+=salary[i];
}
return sum/(salary.length-2);
}
private void insertSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
for (int i = 1; i < arr.length; i++) { // 待插入元素的索引
int insertEle = arr[i];//对待插入元素进行保存
int j = i - 1;
//有序区中存在多少个元素就需要遍历多少次
for (; j >= 0; j--){
if (arr[j] >= insertEle) {
arr[j + 1] = arr[j];
} else {
break;
}
}
//直到找到有序区第一个比待插入元素小的位置,然后在j+1上添加元素
arr[j + 1] = insertEle;
}
}
}
学生分数的最小差值
class Solution {
//插入排序
public void insertSort(int[] nums){
if(nums==null||nums.length==0){
return;
}
for (int i =1; i <nums.length; i++) {
int insertEle=nums[i];
int j=i-1;
for(;j>=0;j--){
if(nums[j]>=insertEle){
nums[j+1]=nums[j];
}else{
break;
}
}
nums[j+1]=insertEle;
}
}
public int minimumDifference(int[] nums, int k) {
if (nums.length == 1) {
return 0;
}
insertSort(nums);
int min=nums[k-1]-nums[0];
for (int i = 1; i <=nums.length-k; i++) {
min=Math.min(min,nums[i+k-1]-nums[i]);
}
return min;
}
}