什么是排序?
排序,在我们生活中很常见,如:点外卖时,看到一份蛋炒饭的店排名;我们在班级中的成绩排名高低;全国各省GDP的排名......这些都是排序。
直接插入排序
根据其定义可知,用自己的话来理解就是,将一个数据,插入到原来就是有序的数组中去的操作就叫做直接插入排序。
直接插入排序思路分析
假设,就有以上这么一个数组,然后有一个tmp需要直接插入到这个数组中去。该咋实现呢?
因为直接插入排序是插入到原来本就有序的数组中去,那么我们就得需要将其tmp值与数组中的每一个值都进行比较。当遍历到数组的某一个值到比tmp值大的,就需要将其整个往后移动一位,并同时插入tmp的值到其数组的那个比tmp值大的位置上。这就是一次插入排序的实现思路。
代码具体实现思路
理解了一次插入排序之后。接下来我们可以先假设其有序数组的最后一个下标为end,那么按照定义数组中下标为0~end的值就是有序的。那么,这时,我们可以设下标为end + 1的为tmp。从tmp开始,让它与前面每个数进行对比,假如比它小,则将其数组整个后移一位,并同时插入tmp的值到数组中比tmp小的值位置上去。直到end的值小于零停止。同时,外面大循环的次数为数组长度减1.
核心实现代码:
void InsertSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
//a[0]~a[end]有序,把数组下标为end + 1的值插入数组后,数组仍保持有序。
int end = i;
int tmp = a[end + 1];
while (end >= 0) {
if (tmp < a[end]) {
a[end + 1] = a[end];
end--;
}
else{
break;
}
}
a[end + 1] = tmp;
}
}
自己原本对插入排序的理解于代码实现:
以下这张图中,只需要将交换位置思想改为插入向后移动思想就是一个插入排序了。这是最初自己的插入排序思想实现思路,发现和实际的插入排序思想有点差异。这里也放着,好提醒一下思路的形成过程。
/*
for (int i = 0; i < n - 1; i++) {
int end = n - 1;
while (end > 0) {
if (a[end] >= a[end - 1]) {
end--;
}
if (a[end] < a[end - 1]) {
int tmp = a[end - 1];
a[end - 1] = a[end];
a[end] = tmp;
end--;
}
}
}*/