插入排序(Insertion sort)是一種簡單直觀且穩定的排序算法。如果有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度為O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。
基本介紹
- 中文名:插入排序
- 外文名:Insertion sort
- 類型:排序方法
- 分類:直接插入排序,二分插入排序
相關術語
關鍵碼
內部排序和外部排序
分類
直接插入排序
折半插入排序(二分插入排序)
原理
插入排序過程示例設計步驟
描述
實現
偽代碼
C語言
void insertion_sort(int array[],int first,int last){ int i,j; int temp; for(i=first+1;i<last;i++) { temp=array[i]; j=i-1; //與已排序的數逐一比較,大於temp時,該數移後 while((j>=0)&&(array[j]>temp)) { array[j+1]=array[j]; j--; } //存在大於temp的數 if(j!=i-1) array[j+1]=temp; }}void insert_sort(int *array,unsigned int n){ int i,j; int temp; for(i=1;i<n;i++) { temp=*(array+i); for(j=i;j>0&&*(array+j-1)>temp;j--) { *(array+j)=*(array+j-1); } *(array+j)=temp; }}#include<iterator>template<typename biIter>void insertion_sort (biIter begin,biIter end){ typedef typename std::iterator_traits<biIter>::value_type value_type; biIter bond=begin; std::advance(bond,1); for(;bond!=end;std::advance(bond,1)) { value_type key=*bond; biIter ins=bond; biIter pre=ins; std::advance(pre,-1); while(ins!=begin&&*pre>key) { *ins=*pre; std::advance(ins,-1); std::advance(pre,-1); } *ins=key; }}PHP版本
functioninsertSort($arr){for($i=1;$i<count($arr);$i++){$tmp=$arr[$i];$key=$i-1;while($key>=0&&$tmp<$arr[$key]){$arr[$key+1]=$arr[$key];$key--;}if(($key+1)!=$i)$arr[$key+1]=$tmp;}return$arr;}Java版本
/***插入排序*@paramarr*@return*/private static int[] insertSort(int[]arr){if(arr == null || arr.length < 2){ return arr;}for(inti=1;i<arr.length;i++){for(intj=i;j>0;j--){if(arr[j]<arr[j-1]){//TODO:int temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;//}else{//接下來是無用功break;}}}return arr;}/***插入排序,上面的todo交換很頻繁,增加很多步驟*@paramarr*@return*/private static int[] insertSort(int[]arr){if(arr == null || arr.length < 2){ return arr;}for(inti=1;i<arr.length;i++){int temp = arr[i];int indx = 0;for(intj=i;j>0;j--){if(arr[j]<arr[j-1]){//TODO:arr[j] = arr[j-1];indx = j-1;}else{//接下來是無用功break;}arr[indx]=temp;}}return arr;}JavaScript版本
//測試數組var arr = new Array(1, 3, 2, 8, 9, 1, 5);//插入排序function InsertionSort(arr) { if (arr == null || arr.length < 2) { return arr; } for (let i = 1; i < arr.length; i++) { for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } return arr;}//控制台輸出console.log(arr);InsertionSort(arr);console.log(arr);C#版本
classProgram{staticvoidMain(string[]args){InsertionSort();}///<summary>///插入排序法///</summary>privatestaticvoidInsertionSort(){Console.WriteLine("插入排序法");inttemp=0;int[]arr={23,44,66,76,98,11,3,9,7};Console.WriteLine("排序前的數組:");foreach(intiteminarr){Console.Write(item+",");}Console.WriteLine();varlength=arr.Length;for(inti=1;i<length;i++){for(intj=i;j>0;j--){if(arr[j]>arr[j-1]){temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;}}//每次排序後數組PrintResult(arr);}Console.ReadKey();}///<summary>///列印結果///</summary>///<paramname="arr"></param>privatestaticvoidPrintResult(IEnumerable<int>arr){foreach(intiteminarr){Console.Write(item+",");}Console.WriteLine();}}Pascal版本
Ruby版本
def insertion_sort(array) array.each_with_index do |element, index| next if index == 0 #第一個元素默認已排序 j = index - 1 while j >= 0 && array[j] > element array[j + 1] = array[j] j -= 1 end array[j + 1] = element end arrayend
Scala版本
definsertSort(ilist:Array[Int]){for(i<-1untililist.length){for(j<-(0untili).reverse){if(ilist(j+1)<ilist(j)){valtmp=ilist(j+1)ilist(j+1)=ilist(j)ilist(j)=tmp}}}}python版本
import randomRange = 100Length = 5list = random.sample(range(Range),Length) #在指定序列中隨機獲取指定長度片段print('before sort:',list)for i in range(1,Length): #默認第一個元素已經在有序序列中,從後面元素開始插入 for j in range(i,0,-1): #逆向遍歷比較,交換位置實現插入 if list[j] < list[j-1]: list[j],list[j-1] = list[j-1],list[j]print('after sort:',list)
