zoukankan      html  css  js  c++  java
  • 简单的排序算法:插入排序法

    算法原理:依次对比每个位置上的元素与之前元素的大小,并进行交换,直道之前元素不大于目标元素

    算法复杂度:O(n^2)

    c++实现整形数组排序

     1 void insertionSort(int arr[],int n)
     2 {
     3     for(int i=1;i<n;i++)
     4         for(int j=i;j>0;j--)
     5         {
     6             if(arr[j-1]>arr[j])
     7                 swap(arr[j],arr[j-1]);
     8             else
     9                 break;
    10         }
    11     return;
    12 }

    每次swap经过了三次赋值运算,可通过改写语句优化算法,建立一个临时变量存储当前元素数据,用一次赋值运算代替swap函数。

     1 void insertionSort(int arr[],int n)
     2 {
     3     for(int i=1;i<n;i++)
     4     {
     5         int e=arr[i];
     6         int j;
     7         for(j=i;j>0&&arr[j-1]>e;j--)
     8             arr[j]=arr[j-1];
     9         arr[j]=e;
    10     }
    11     return;
    12 }

    将第二层循环内的判断语句加入到了for循环判断中,省去了break,需注意的是,与j-1元素对比的是存储当前元素的临时变量e。

    转化为范型

     1 template <typename T>
     2 void insertionSort(T arr[],int n)
     3 {
     4     for(int i=1;i<n;i++)
     5     {
     6         T e;
     7         int j;
     8         for(j=i;j>0&&arr[j-1]>e;j--)
     9             arr[j]=arr[j-1];
    10         arr[j]=e;
    11     }
    12     return;
    13 }

    算法特点是经过排序的部分顺序确定,而第一个元素自然有序,所以第一层循环从i=1开始,第二层循环内,判断之前元素不大于当前元素时,说明已经找到当前元素位置,可用break跳出本次循环。

    因为存在跳出循环的情况,所以插入排序更适合基本有序的数组排序。

  • 相关阅读:
    Spring HTTP Service
    Nexus搭建Maven私服
    虚拟机Class文件结构笔记
    JVM内存区域与内存溢出异常
    深入学习虚拟机类加载过程
    虚拟机常用的内存查看与分析工具
    对Java内存模型即JMM的理解
    通过Redux源码学习基础概念一:简单例子入门
    跟着官网的例子学Reacjs (一)FilterableProductTable
    es6继承 vs js原生继承(es5)
  • 原文地址:https://www.cnblogs.com/Bird-of-Paradise/p/6384938.html
Copyright © 2011-2022 走看看