将待排序表分为两部分,左侧为有序区,右侧为无序区。 插叙算法的排序过程就是将右侧无序区的元素逐个插入到左侧有序区中,以此构成新的有序区。
现在直接上一下代码: void insert_sort(int* arr,int n) { int temp; for(int j = 1;j < n;j++) { temp = arr[j]; int i = j - 1; while(temp < arr[i] && i >= 0) { arr[i + 1] = arr[i]; i--; } arr[i + 1] = temp; } }其实插入排序的核心算法也是这里的循环 因为有“有序区”和“无序区”的区分,所以对于插入排序来说它的起始点其实是线性表的第二个数据(也就是默认第一个数据为有序),然后命名一个temp用于储存待插入的数据,再定义出待插入数据所在位置的前一位 i ,然后从 i 到 0 开始依次遍历,直到遇到一个比temp数值小的数据。如果一直没有遇到比他小的数,但是此时的 i 已经不满足大于等于零的要求了,所以末尾的arr[i+1]其实是使其归为为原来的0,最后再赋值。
最后给个例子: #include<iostream> using namespace std; void insert_sort(int* arr,int n) { int temp; for(int j = 1;j < n;j++) { temp = arr[j]; int i = j - 1; while(temp < arr[i] && i >= 0) { arr[i + 1] = arr[i]; i--; } arr[i + 1] = temp; } } int main() { const int n = 10; int a[n]; for(int i = 0;i < n;i++) a[i] = i*i -5*i+5; for(int i = 0;i < n;i++) cout<<a[i]<<" "; cout<<endl; insert_sort(a,n); for(int i = 0;i < n;i++) cout<<a[i]<<" "; }