插入排序 Insertion Sort

参考网站:

https://www.geeksforgeeks.org/insertion-sort/

整体思想如下图,没错,和你想的一样,不要觉得不可能这么简单,确实就这么简单,但是代码写起来还是有一些注意的地方,否则写不出来。

// C++ program for insertion sort  
#include <bits/stdc++.h> 
using namespace std; 
  
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)  
{  
    // 理解下面插入排序代码的难点,就在于理解 i, key, j 这三个变量
    // i主要是用来遍历整个数组的,且我们从 1 开始遍历(即从第二个元素开始),我们认为并始终保证i之前的元素始终是排好序的,你想想看是不是这个样子?!
    // key主要是用来保存当前遍历到的元素值,可以发现,key在一次循环中,只被赋值一次,相当于定值
    // j主要是用来依次访问i之前的元素,并和key进行比较,如果大于key,则进行交换(并没有真的交换)。
    // 这里注意两点:
    // 1. 由于i之前的元素是排好序的,所以只需要一直比较到没有元素大于key为止,那么它之前的元素一定比key小;
    // 2. 这里并没有采用直接交换的方式,而是在遍历的过程中,逐步去寻找key该有的位置:如果arr[j]比key大,那么arr[j]就向前移即可,直到不需要移动为止,此时的位置即为key该在的位置
    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;  
    }  
}  
  
// A utility function to print an array of size n  
void printArray(int arr[], int n)  
{  
    int i;  
    for (i = 0; i < n; i++)  
        cout << arr[i] << " ";  
    cout << endl; 
}  
  
/* Driver code */
int main()  
{  
    int arr[] = { 12, 11, 13, 5, 6 };  
    int n = sizeof(arr) / sizeof(arr[0]);  
  
    insertionSort(arr, n);  
    printArray(arr, n);  
  
    return 0;  
}  
  
// This is code is contributed by rathbhupendra 

 写在后面:

理解代码没有捷径,就是干!

欢迎留言、点赞、交流、指正!

原文地址:https://www.cnblogs.com/Flash-ylf/p/11006980.html