Skip to content

Latest commit

 

History

History
213 lines (172 loc) · 5.09 KB

README.md

File metadata and controls

213 lines (172 loc) · 5.09 KB

插入排序

先来看一个问题。一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?很简单,我们只要遍历数组,找到数据应该插入的位置将其插入即可。

这是一个动态排序的过程,即动态地往有序集合中添加数据,我们可以通过这种方法保持集合中的数据一直有序。而对于一组静态数据,我们也可以借鉴上面讲的插入方法,来进行排序,于是就有了插入排序算法。

那么插入排序具体是如何借助上面的思想来实现排序的呢?

首先,我们将数组中的数据分为两个区间,已排序区间未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

与冒泡排序对比:

  • 在冒泡排序中,经过每一轮的排序处理后,数组后端的数是排好序的。
  • 在插入排序中,经过每一轮的排序处理后,数组前端的数是排好序的。

代码示例

Python3

definsertion_sort(array): foriinrange(len(array)): cur_index=iwhilearray[cur_index-1] >array[cur_index] andcur_index-1>=0: array[cur_index], array[cur_index-1] = ( array[cur_index-1], array[cur_index], ) cur_index-=1returnarrayarray= [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] print(insertion_sort(array))

Java

importjava.util.Arrays; publicclassInsertionSort { privatestaticvoidinsertionSort(int[] nums) { for (inti = 1, j, n = nums.length; i < n; ++i) { intnum = nums[i]; for (j = i - 1; j >= 0 && nums[j] > num; --j) { nums[j + 1] = nums[j]; } nums[j + 1] = num; } } publicstaticvoidmain(String[] args) { int[] nums = {1, 2, 7, 9, 5, 8}; insertionSort(nums); System.out.println(Arrays.toString(nums)); } }

C++

#include<iostream> #include<vector>usingnamespacestd;voidprintvec(const vector<int>& vec, const string& strbegin = "", const string& strend = "") { cout << strbegin << endl; for (auto val : vec) { cout << val << "\t"; } cout << endl; cout << strend << endl; } voidinsertsort(vector<int>& vec) { for (int i = 1; i < vec.size(); i++) { int j = i - 1; int num = vec[i]; for (; j >= 0 && vec[j] > num; j--) { vec[j + 1] = vec[j]; } vec[j + 1] = num; } return; } intmain() { vector<int> vec = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; printvec(vec); insertsort(vec); printvec(vec, "after insert sort"); return (0); }

Go

package main import"fmt"funcinsertionSort(nums []int) { fori, n:=1, len(nums); i<n; i++ { j, num:=i-1, nums[i] for ; j>=0&&nums[j] >num; j-- { nums[j+1] =nums[j] } nums[j+1] =num } } funcmain() { nums:= []int{1, 2, 7, 9, 5, 8} insertionSort(nums) fmt.Println(nums) }

Rust

fninsertion_sort(nums:&mutVec<i32>){let n = nums.len();for i in1..n {letmut j = i - 1;let temp = nums[i];while j >= (0asusize) && nums[j] > temp { nums[j + 1] = nums[j]; j -= 1;} nums[j + 1] = temp;}}fnmain(){letmut nums = vec![1,2,7,9,5,8];insertion_sort(&mut nums);println!("{:?}", nums);}

JavaScript

functioninsertionSort(inputArr){letlen=inputArr.length;for(leti=1;i<=len-1;i++){lettemp=inputArr[i];letj=i-1;while(j>=0&&inputArr[j]>temp){inputArr[j+1]=inputArr[j];j--;}inputArr[j+1]=temp;}returninputArr;}letarr=[6,3,2,1,5];console.log(insertionSort(arr));

C#

usingSystem.Diagnostics;usingstaticSystem.Console;namespacePro;publicclassProgram{publicstaticvoidMain(){int[]test=newint[]{31,12,10,5,6,7,8,10,23,34,56,43,32,21};InsertSortNums(test);foreach(varitemintest){WriteLine(item);}}publicstaticvoidInsertSortNums(int[]nums){for(intinitial=1;initial<nums.Length;initial++){for(intsecond_sort=0;second_sort<initial;second_sort++){if(nums[second_sort]>nums[initial]){swap(refnums[second_sort],refnums[initial]);}}}}privatestaticvoidswap(refintcompare_left,refintcompare_right){inttemp=compare_left;compare_left=compare_right;compare_right=temp;}}
close