3.4 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			3.4 KiB
		
	
	
	
	
	
	
	
title, localeTitle
| title | localeTitle | 
|---|---|
| Freecodecamp Algorithm Insertion Sort Guide | Freecodecamp算法插入排序指南 | 
插入排序是基于_比较_的排序 。排序算法是基于比较的,如果它使用比较运算符(例如less than和greated than )来查找两个数字之间的顺序。
在这种排序技术中,我们始终在列表的较低位置维护一个已排序的子列表,然后我们从列表的其余部分中取一个元素并将其插入到正确的位置。我们这样做,直到所有元素都插入到子列表中。例如,在玩扑克牌时,我们会将牌分类。从左侧开始向右移动,我们继续将卡插入正确的位置直至结束。
例
在上面的示例中, grey shaded子列表始终排序。请注意,在开始的时候,子列表包含ONY一个元素, _平凡_排序。然后在每一步我们将white shaded子列表的最左边元素插入其正确的位置。
因此,我们以这种方式对完整列表进行了排序。
算法
Loop for i=0 to N-1: 
 * Pick element array<a href='https://repl.it/CWZq' target='_blank' rel='nofollow'>i] and insert it into sorted sublist array[0...i-1] 
复杂
Space complexity: O(1)      // Auxillary/temporary space is used. 
 
 Time complexity: O(n*n)     // Two nested for loops are used. 
C ++实现
// Function to sort an array using insertion sort 
 void insertionSort(int arr[], int n) 
 { 
   int i, key, j; 
   for (i = 1; i < n; i++) 
   { 
       key = arr[i]; 
       j = i-1; 
 
       /* Move elements of arr[0..i-1], that are greater than key, 
      to one position ahead of their current position */ 
   while (j >= 0 && arr[j] > key) 
   { 
       arr[j+1] = arr[j]; 
       j = j-1; 
   } 
   arr[j+1] = key; // place element key at it's correct place 
   } 
 } 
 
 int main() 
 { 
    // array to be sorted 
    int arr[5] = {12, 11, 13, 5, 6}; 
 
    // call the insertion sort 
 insertionSort(arr, 5); 
 
 // prints sorted array ie 5 6 11 12 13 
 for(int i=0; i<5; i++) 
    std::cout << arr[i] << " "; 
 return 0; 
 } 
:rocket:[运行代码## Python实现
# Function to perform insertion sort 
 def insertionSort(arr): 
    # Traverse through array 
    for i in range(1, len(arr)): 
        key = arr<a href='https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":rocket:"' target='_blank' rel='nofollow'>i] 
        # Move elements of arr[0..i-1], that are greater than key, 
        # to one position ahead of their current position 
        j = i-1 
        while j>=0 and key < arr[j] : 
                arr[j+1] = arr[j] 
                j -= 1 
        arr[j+1] = key # place element key at it's correct place 
 
 # array to be sorted 
 arr = [12, 11, 13, 5, 6] 
 # call the insertion sort 
 insertionSort(arr) 
 # prints sorted array ie 5 6 11 12 13 
 for i in range(len(arr)): 
    print(arr[i],end = ' ') 
好处
- 适用于几乎排序的小型数据和数据集。
 - 简单实施。
 - 通常比冒泡排序和选择排序更好,通常与合并排序一起使用。
 
缺点
- 与合并排序,堆排序和快速排序相比,它在大型数据集上的效率较低。
 

