直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
核心代码(C实现)
void InsertSort(int arr[], int len) { //无序数组的下标 int i; //有序数组的下标 int j; //保存无序数组第一个元素的值 int temp; //检测参数 assert(arr!=NULL && len<=0); for(i=0; i<len; ++i) { temp = arr[i]; j = i-1; while(temp<arr[j] && j>=0) { //把大的元素放到后面 arr[j+1] = arr[j]; --j; } //把无序数组的第一个值放到正确的位置 arr[j+1] = temp; } }
核心代码(C++实现)
template <typename T> void insertSort(T array[], int length) { if ((NULL == array) || (length < 2)) { return; } for (int disorder_index = 0; disorder_index < length; ++disorder_index) // 遍历无序数据 { int disorder_value = array[disorder_index]; // 保存无序数据的第一个值 int order_index = disorder_index-1; // 记录有序数据的下标 while ((order_index >= 0) && (disorder_value < array[order_index])) // 根据(order_index>=0)判断无序数据中的第一个值是否和所有的有序数据比较完成 { array[order_index+1] = array[order_index]; // (从小到大)当无序的值 < 有序的值,就将有序数据向后移动一个位置 --order_index; } array[order_index+1] = disorder_value; // 将无序的值 插入 正确的位置 } }
算法分析:
最好时间复杂度:O(n)
平均时间复杂度:O(n^2)
最坏时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
直接插入排序在性能上要比简单选择排序和冒泡排序好一些。
直接插入排序在记录比较少和记录本身是基本有序时,效率是比较高的。由于这两个条件,后面就产生了希尔排序。