参考网站:
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
写在后面:
理解代码没有捷径,就是干!
欢迎留言、点赞、交流、指正!