直接插入排序(Straight Insertion Sort)
- 直接插入排序是一种最简单的排序方法,基本操作是将一条记录插入到已近排好序的有序表中,从而得到一个新的,记录数增加1的有序表。是稳定排序。
- 算法步骤:
- (1)设待排记录存放在数组r[0…n]中,r[0],是一个有序序列。
- 循环n-1次,每次使用顺序查找法,查找r[i] (i=1,2,3…n)在已排好序的序列r[0…i-1]中的位置,然后将r[i]插入到r[0…i-1]中,直到将r[n]插入到表长为n-1的有序序列r[0…n-1]当中,得到长度为n的有序序列。
- 图解:
- 设初始关键字序列为{49,38,65,97,76,13,27,49}
- 代码示例:
#include<iostream> using namespace std; void straight_insertion_sort(int *array){ int temp,i,j; //用来暂存需要插入的值 for(i=1; i<8; i++){ temp = array[i]; for(j=i-1; temp<array[j] && j>=0; j--) //与有序序列比较,从后往前,方便后移 array[j+1]=array[j]; array[j+1]=temp; //插入值 } } int main(){ int data[] = {49,38,65,97,76,13,27,49}; straight_insertion_sort(data); for(int i=0; i<8; i++){ cout<<data[i]<<" "; } return 0; } Output:13 27 38 49 49 65 76 97
- 时间复杂度O(n^2):
最好情况下:即待排记录关键字按升序排列,比较n-1次,不移动序列;
最坏情况下:即待排记录关键字按降序排列,比较(n2)/2次,移动(n2)/2次。
故时间复杂度为O(n^2)
- 空间复杂度O(1)
只需要一个辅助存储temp