• 插入排序 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 

     写在后面:

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

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

  • 相关阅读:
    [JZOJ 5788] 餐馆
    [JZOJ 5778] 没有硝烟的战争
    problems_scala
    好迷茫,好迷茫啊
    公布下我的数据库操作层
    关于数据库大并发量(未完成)
    关于http协议头
    管理心得体会
    数据库表分区
    公共的Json操作类
  • 原文地址:https://www.cnblogs.com/Flash-ylf/p/11006980.html
Copyright © 2020-2023  润新知