基础算法(3):排序(3)插入排序

1.插入排序实现

插入排序的工作原理是**:通过构建有序序列,对于未排序数据,在已经排序的序列从后向前扫描,找到位置并插入,类似于平时打扑克牌时,将牌从大到小排列,每次摸到一张牌就插入到正确的位置。**

实现逻辑:

(1)从第一个元素出现,该元素认为已经被排好序

(2)取出下一个元素,在已经排序的序列中从后向前扫描

(3)如果扫描到某个元素大于取出的新元素,将该元素移到下一个位置

(4)重复(3),直到找到已排序的元素小于或者等于新元素的位置

(5)将新元素插入到该位置后面

(6)重复(2)-(5)

代码实现:

复制代码
void insertSort(int* arr,int len)
{
   for(int i=1;i<len;i++)
   {
     int cur=arr[i];
     int j=i-1;
     while(j>=0&&arr[j]>cur)
         {
           arr[j+1]=arr[j];
           j--;
         }
     arr[j+1]=cur;
    }
}

2.插入排序的时间复杂度

问题规模仍然为n,最好情况是序列是升序,这样只需要比较n-1次,最坏情况是序列是降序,需要比较n(n-1)次,所以时间复杂度为O(n^2)

3.leetcode题目

3.1 删除某些元素后的数组均值

复制代码
void insertionSort(int *a ,int n){
   int i,j;
   int tmp ;
    for(i = 1; i < n; ++i)
    {
        for(j = i - 1; j>=0; --j)
        {
            if(a[j] > a[j+1])
            {
                tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp; 
            }
        }
    }
}
double trimMean(int* arr, int arrSize){
    insertionSort(arr,arrSize);
    int cnt = arrSize / 20;
    double count = 0;
    for(int i = cnt; i < arrSize - cnt; ++i){
        count += arr[i];
    }
    return count /  (arrSize - 2*cnt);
}

3.2 去掉最低工资和最高工资后的工资平均值

复制代码
double average(int* salary,int salarySize){
    for (int i = 1; i < salarySize; i++) 
    {
        int tmp = salary[i];
        int j = i - 1;
        for (; j >= 0 && tmp < salary[j]; j--) 
        {
            salary[j + 1] = salary[j];
        }
        salary[j + 1] = tmp;
    }
    double ans=0;
    for(int i=1;i<salarySize-1;i++)
    {
        ans+=salary[i];
    }
    return ans/(salarySize-2); 
}

3.3 学生分数的最小差值

复制代码
int minimumDifference(int* nums, int numsSize, int k) {
     for (int i = 1; i < numsSize; i++)
    {
        int tmp = nums[i];
        int j = i - 1;
        for (; j >= 0 && tmp < nums[j]; j--) 
        {
            nums[j + 1] = nums[j];
        }
        nums[j + 1] = tmp;
    }
     int ret=100000;
     for(int i=0;i+k-1<numsSize;i++)
     {
         int ans=nums[i+k-1]-nums[i];
         if(ans<ret){
             ret=ans;
         }
     }
     return ret;
}
相关推荐
Zane199416 小时前
归并排序和堆排序都能保证O(nlogn),为什么谁也没法把稳定和原地两个优点占全
算法·排序算法
虚无的纽扣1 天前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
多弗朗皮卡丘1 天前
数据结构9:排序算法
c语言·数据结构·排序算法
无忧.芙桃2 天前
数据结构之排序算法(上):从评价指标到插入、希尔、选择与堆排序
c语言·c++·排序算法
LuminousCPP2 天前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
shehuiyuelaiyuehao3 天前
算法46,分治快排,排序数组
java·算法·排序算法·排序
Zane19943 天前
冒泡、选择、插入排序都是O(n²),希尔排序凭什么说自己能更快
算法·排序算法
ysu_03145 天前
19-插入排序与希尔排序
数据结构·算法·排序算法
个 人 练 习 生5 天前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法
Msshu1235 天前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法