首页 > 编程语言 >十大经典排序算法-插入排序

十大经典排序算法-插入排序

时间:2024-11-11 14:49:22浏览次数:3  
标签:arr int 插入排序 current 算法 实例 排序 preIndex

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

1. 算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

2. 动图演示


代码实现

JavaScript

实例

function insertionSort(arr) {    
var len = arr.length;    
var preIndex, current;    
for (var i = 1; i < len; i++) {        
preIndex = i - 1;        
current = arr[i];        
while(preIndex >= 0 && arr[preIndex] > current) {            
arr[preIndex+1] = arr[preIndex];            
preIndex--;        
}        
arr[preIndex+1] = current;    
}    
return arr;
}

Python

实例

def insertionSort(arr):    
for i in range(len(arr)):        
preIndex = i-1        
current = arr[i]        
while preIndex >= 0 and arr[preIndex] > current:            
arr[preIndex+1] = arr[preIndex]            
preIndex-=1        
arr[preIndex+1] = current    
return arr

Go

实例

func insertionSort(arr []int) []int {        
for i := range arr {                
preIndex := i - 1                
current := arr[i]                
for preIndex >= 0 && arr[preIndex] > current {                        
arr[preIndex+1] = arr[preIndex]                        
preIndex -= 1                
}                
arr[preIndex+1] = current        
}        
return arr
}

Java

实例

public class InsertSort implements IArraySort {    
@Override    public int[] sort(int[] sourceArray) throws Exception {        
*// 对 arr 进行拷贝,不改变参数内容*        
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);        
*// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的*        
for (int i = 1; i < arr.length; i++) {            
*// 记录要插入的数据*            
int tmp = arr[i];            
*// 从已经排序的序列最右边的开始比较,找到比其小的数*            
int j = i;            
while (j > 0 && tmp < arr[j - 1]) {                
arr[j] = arr[j - 1];                
j--;           
 }            
*// 存在比其小的数,插入*            
if (j != i) {                
arr[j] = tmp;            
}        
}        
return arr;   
 }
}

PHP

实例

function insertionSort($arr){    
$len = count($arr);    
for ($i = 1; $i < $len; $i++) {        
$preIndex = $i - 1;        
$current = $arr[$i];        
while($preIndex >= 0 && $arr[$preIndex] > $current) {            
$arr[$preIndex+1] = $arr[$preIndex];            
$preIndex--;        
}        
$arr[$preIndex+1] = $current;    
}    
return $arr;
}

C

实例

void insertion_sort(int arr[], int len){
        int i,j,key;
        for (i=1;i<len;i++){
                key = arr[i];
                j=i-1;
                while((j>=0) && (arr[j]>key)) {
                        arr[j+1] = arr[j];
                        j--;
                }
                arr[j+1] = key;
        }
}

C++

实例

void insertion_sort(int arr[],int len){
        for(int i=1;i<len;i++){
                int key=arr[i];
                int j=i-1;
                while((j>=0) && (key<arr[j])){
                        arr[j+1]=arr[j];
                        j--;
                }
                arr[j+1]=key;
        }
}

C#

实例

public static void InsertSort(int[] array){    
for(int i = 1;i < array.length;i++)    
{        
int temp = array[i];        
for(int j = i - 1;j >= 0;j--)        
{            
if(array[j] > temp)           
 {                
array[j + 1] = array[j];                
array[j] = temp;            
}            
else break;        
}    
}
}

Swift

实例

for i in 1..<arr.endIndex {    
let temp = arr[i]    
for j in (0..<i).reversed() {        
if arr[j] > temp {            
arr.swapAt(j, j+1)        
}
    }
}

标签:arr,int,插入排序,current,算法,实例,排序,preIndex
From: https://blog.csdn.net/qq_45398836/article/details/143685625

相关文章

  • 区域人数统计视频分析网关算法网关客流统计AI算法介绍及应用场景
    在当今数字化转型的浪潮中,人工智能技术正以其独特的数据处理能力和智能分析优势,深刻改变着各行各业的运作方式。特别是在客流量管理这一领域,AI算法的应用已经成为提升效率、优化决策的关键工具。本文将详细介绍客流量统计AI算法及其在区域人数统计视频分析网关中的应用,展示如何通......
  • 随机化算法
    随机化算法随机化函数rand()srand(seed);intx=rand()%n+1;seed可以是一个常数如114514也可以是时间time(0)。注意,rand()函数在windows系统下返回的取值范围为\([0,2^{15}-1]\),在linux系统下返回的取值范围为\([0,2^{31}-1]\)。mt19937mt19937rd(seed);pf("......
  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值+ 239. 滑动窗口最大值+347.前
    今天接着补上周末的栈与队列的part2,下午继续完成今天的任务。150.逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为 '+'、'-'、'*' 和 '/' 。每个......
  • 代码随想录算法训练营第十天 | 232.用栈实现队列+225. 用队列实现栈+20. 有效的括号+1
    加入训练营有点晚,没跟上任务就开始有些偷懒没有真的认真开始,从第十天开始下决心认真完成每天任务还有博客记录学习过程。栈与队列理论基础首先是学习了栈和队列的理论基础,队列 先进先出,栈 先进后出。栈 以底层容器完成其所有的工作,且对外接口统一,有.push,.pop等,不提供......
  • (动画版)排序算法 -选择排序
    文章目录1.选择排序(SelectionSort)1.1简介1.2选择排序的步骤1.3选择排序的C实现1.4选择排序的时间复杂度1.5选择排序的空间复杂度1.6选择排序的动画1.选择排序(SelectionSort)1.1简介选择排序(SelectionSort)是一种简单直观的排序算法。它的工作原理是反复......
  • 数组算法练习题
    第一题:寻找锦鲤公司年会有一个寻找锦鲤的游戏,每一个员工随意写一个字,如果在“锦鲤”词库中有这个字,那么就奖励500元锦鲤红包,否则就没有,每人只能玩一次。现有锦鲤字库如下,它们按照Unicode编码值从小到大排序:char[]koiFishWords={'一','今','地','定','年','开','我','果','......
  • [数组排序] 0384. 打乱数组
    文章目录1.题目大意2.题目大意3.示例4.解题思路5.参考代码1.题目大意384.打乱数组-力扣(LeetCode)2.题目大意描述:给定一个整数数组nums。要求:设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是等可能的。实现Solutionclass:Sol......
  • 算法性能测试基础
    算法的性能测试是一个综合评估算法在不同条件下的表现和效率的过程。在进行算法性能测试时,需要关注多个关键指标,以确保全面、准确地评估算法的性能。以下是对算法性能测试的详细解释和需要关注的指标的归纳:一、算法性能测试概述算法性能测试的目的是验证算法在各种输入情况下的......
  • 69.《排序》
    可算结束了简单数据结构的学习收官!壹排序的基本概念排序主要分为内部排序和外部排序(我考试主要涉及内部排序因此外部排序略过)对于内部排序算法都需要做的是比较和移动重点---稳定性:经过排序后能使关键字相同的元素保持原顺序中的相对位置不变(排序算法内允许有相同......
  • 后缀排序
    后缀排序即对字符串\(S\)的所有后缀根据字典序排序实现算法1:暴力排序直接\(O(n)\)比较,时间复杂度\(O(n^2\logn)\)算法2:倍增优化我们考虑长为\(2^k\)的串的比较,该串可以分为前后均长\(2^{k-1}\)的串,那么只要知道这两个串的排名,就可以对所有\(2^k\)的串进行双关键字排序于是......