直接插入排序详解
直接插入排序
1 基本思想
直接插入排序是一种简单的插入排序法,其思想的关键就是将待排序的序列里的数一个个插入已经排序好的序列里面,直到未排序的序列数全部插入为止,从而得到一个新的排序好的序列
生活示例:
我们在打扑克牌将牌按大小顺序依次的排序的时候,我们抓来一张新的牌便根据我们手上已经排序好的牌依次从后面比较并插入合适位置,从而保持手中牌的有序性。
2 直接插入排序动态图
我们可以从递归的角度来看待直接插入算法,你想让整个数组有序,那你就要让该数组前
n-1
个数有序,并将最后一个数从后面依次遍历这个大小为n-1
的有序数组并插入其中,从而让整个数组有序。
3 直接插入排序代码实现
void InsertSort(int arr[], int size)
{int temp = 0;int end = 0;//定义一个排序好的数组最后一个下标for (int i = 0; i < size - 1; i++){end = i;temp = arr[end + 1];while (end >= 0){ if (arr[end] > temp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = temp;}
}
直接插入代码详解
第一部分:
int temp = 0;
int end = 0;//定义一个排序好的数组最后一个下标
temp
用来保存待插入有序序列的元素,而end
用来记录有序的序列的最后元素下标
第二部分
我们从有序序列只有一个元素,通过不断的循环插入,使数组最后有序,而变量i
用来记录每一次进入有序序列的最后元素下标。而要插入数据的下标为i+1
,所以最后一个元素插入有序数组的最后一个下标为size-2
,所以循环条件为i < size - 1
for (int i = 0; i < size - 1; i++);
第三部分
while (end >= 0){ if (arr[end] > temp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = temp;
当arr[end] > temp
时先将end位置元素移动到后面元素位置arr[end + 1] = arr[end]
,并将end--
从而遍历这个已经有序的数组,将它们依次与temp
比较,如果arr[end] >temp
不成立时则新加入元素temp
应该在end+1
的位置,循环的终止条件是end>=0
即遍历到第一个元素位置,如果跳出这个循环temp
还没有插入数组中,那说明temp
最小该插入第一个位置即下标为0
的位置,即end+1
(end此时为-1)。
4 直接插入排序时间复杂度分析
- 最好时间复杂度为O(n),即数组一开始就是有序的
- 最坏时间复杂度为O(n2)
排序元素越接近有序,直接插入排序算法时间效率越高。