版权声明:欢迎交流学习,转载请注明出处。 https://blog.csdn.net/qq_23869697/article/details/82700986
插入排序的想法
通俗版:
从名字说起,想象我们在排队,你想插入到队伍中靠前的位置。
插入规定:保证你相邻的前面一个人同意,你才能往队伍的前一个位置挪。
在往队伍前面挪之前你得先从现在在队伍中的位置让出来,让前面的那个人可以往后移腾出一个位置给你,你才能向前。
当前面的一个人同意跟你换了,那么这个人就往后移动到你之前所在的位置;
那它的位置上就空了之后,你在队伍中的位置就向前移了一个,即这个空位置;
你再问前一个人愿不愿跟你换,如果它愿意,你就可以一直换下去,你的位置一直向前移动,直到你到了第一个位置。
如果你前面的那个人不愿意跟你换,那你只能待在当前的空位置上,所以能换的要满足两个条件:
(1)你前面那个人的同意
(2)你前面还有人
专业版:
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
C++实现:
C++版是很能体现排序中的每一步操作的。
下面的代码来自博主MoreWindows
void Insertsort1(int a[], int n)
{
int i, j, k;
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--)
if (a[j] < a[i])
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//将比a[i]大的数据向后移
int temp = a[i];
for (k = i - 1; k > j; k--)
a[k + 1] = a[k];
//将a[i]放到正确位置上
a[k + 1] = temp;
}
}
改进版1 - 搜索和数据后移这二个步骤合并
void Insertsort2(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
if (a[i] < a[i - 1])
{
int temp = a[i];
for (j = i - 1; j >= 0 && a[j] > temp; j--)
a[j + 1] = a[j];
a[j + 1] = temp;
}
}
改进版2 - 用数据交换代替数据后移
void Insertsort3(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
Swap(a[j], a[j + 1]);
}
Python实现:
def insertion_sort(s):
n = len(s)
for i in range(1,n): # 从你前面的那个人问起 n = 1
value = s[i] # 你
pos = i # 你的位置
while s > 0 and value < s[pos-1]: # 你不在第一个位置上,你前面的人愿意跟你换
s[pos] = s[pos-1] # 前一个人向后移
pos -= 1 # 记下前一个值向后移后留下空位置(实际上这个位置还是原来的值)
s[pos]=value # 不能换了只能停在当前的空位上
测试代码:
import random
rand_seq = [random.randint(0,20) for _ in range(20)]
insertion_sort(rand_seq)
查看1的插入情况:
在线链接: https://goo.gl/gJfNuS