1、直接插入排序
插入排序的原理与整理扑克牌类似,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。【适用于某些记录数据本身存在有序,且其中少量需要排序,此时使用该中算法效果较好,快速】】
2、具体分析
- 从数列第一个元素开始,约定该元素已经排好序
- 取下一个元素,约定为待插入元素,在已经排序的元素序列中从后向前扫描,如果发现插入元素小于该元素,则将该元素位置后移一位。
- 重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素
- 重复2,3步骤,完成排序。
现在以具体【2,1,6,3,5】为例,首先以数列首元素为目标,认为其已经排好序。【【2】,1,6,3,5】
第一轮:1<2;因此2需后移1位【【1,2】,6,3,5】
第二轮:6>2,所以不变
第三轮:3<6,交换【【1,2,3】,6,5】,3>2不变
第四轮:5<6,交换【1,2,3,5】,6】,5>3不变【1,2,3,5,6】完成数列排序。
3、代码实现
/*
作者:kimicr
时间:20200327
功能:直接插入排序
特点:时间复杂度【n^2】
*/
#include"iostream"
#include"Sort.h"
using namespace std;
void InsertSort(int *array, int length)
{
for (int i = 1; i < length; i++)
{
int temp = array[i];
int j;
for (j = i - 1; j >= 0&&temp < array[j]; j--)
{
//SWAP(array, j, j + 1); //这种方式,会有许多无意义交换产生,不推荐。
array[j + 1] = array[j]; //大于插值的数往后移动一位
//然后j减一,继续与插数比较,若任然大于则重复上述过程,否则退出
}
array[j+1] = temp; //退出循环后,将插值放入正确位置
}
}