数据结构-插入排序
一.概要
插入排序是一种基于比较的排序算法,其基本思想是将待排序的元素插入到已排序的序列中,形成新的有序序列。
插入排序算法的过程如下:
将待排序序列分为两部分:已排序部分和未排序部分;
初始时,已排序部分只有一个元素,即第一个元素,未排序部分包含剩下的所有元素;
对于未排序部分中的每个元素,从后向前扫描已排序部分,找到其在已排序部分中的位置;
将该元素插入到已排序部分中的相应位置,使得插入后仍然保持有序。
在实现过程中,我们可以使用循环来遍历未排序部分中的每个元素,并将其插入到已排序部分中。具体实现方法是,从当前位置向前遍历已排序部分,找到第一个比当前元素小的位置,然后将当前元素插入到这个位置之后。插入排序算法的时间复杂度为 O(n2)O(n2),其中 nn 是待排序序列的长度。
相比冒泡排序和选择排序,插入排序虽然执行次数也是 O(n2)O(n2),但是其内部循环的比较操作更少,因此效率更高。尤其对于基本有序或者小规模的序列,插入排序的性能表现更为优秀。
void InsertSort(int* a, int n) {
for (int i = 1; i < n; i++)
{
int end=i-1;
int tmp=a[i];
//将tmp插入[0,end]区间
while (end>=0)
{
if (tmp < a[end])
{
a[end + 1] =a[end];
--end;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
该函数接受两个参数:一个整型数组 a
和数组的长度 n
。该函数的实现过程如下:
for
循环从第二个元素开始遍历整个数组,每次从数组中取出一个元素并保存在变量tmp
中;变量
end
记录已排序部分的最后一个元素的下标,初始值为当前元素的前一个下标;使用
while
循环从已排序部分的最后一个元素向前遍历,将所有比当前元素大的元素向右移动一位(即将元素a[end]
移动到a[end + 1]
的位置),直到找到第一个比当前元素小的元素的下标,将变量end
更新为该下标;将变量
tmp
插入到合适的位置上(即将tmp
赋值给位于下标end+1
的元素)
测试文件
void test1() {
int a[] = {1,8,9,10,11,12,18,16,19,20};
int n = sizeof(a) / sizeof(a[0]);
PrintSort(a, n);
InsertSort(a,n);
PrintSort(a,n);
}
int main() {
test1();
return 0;
}
小蒋同学的CSDN: 用于CSDN文章中的代码分享 - Gitee.comhttps://gitee.com/jiang-yanxi123/xiaojiangs---csdn/tree/master/test0408