插入排序,不断从无序区取出一个元素,插入到有序区中。
算法步骤:
- 假设第一个元素为有序区,第二个元素起为当前无序区,从无序区取出第一个元素(即第二个元素),与第一个元素作比较,如果较大,则插入在后面,否则插入在前面。
- 从无序区取出一个元素,与有序区元素进行比较,如果较小则交换位置,继续比较,直到找出插入位置进行插入。
- 重复第2 步。
c
#include <stdio.h>
void insert(int *arr,int size){
for(int i = 0;i< size;i++){
int ele = arr[i];
int curPosition = i;
for(int j = i-1; j >= 0;j--){
if(arr[j] > ele){
arr[curPosition] = arr[j];
curPosition = j;
}
}
arr[curPosition] = ele;
}
}
int main(){
int arr[8] = {5,8,6,3,9,2,1,7};
insert(arr,8);
for(int i =0; i < 8;i++){
printf("%d\t",arr[i]);
}
printf("\n");
return 0;
}
插入排序要进行n-1轮,每一轮在最坏情况下的比较次数分别是1次,2次,3次,...,n-1次,所以它的最坏时间复杂度为O(n2)
由于插入排序也是原地排序,也没有借助额外的存储空间,所以它的空间复杂度为O(1).
选择排序与插入排序的区别:
1.选择排序的有序区中的元素的位置确定后是不变,因为它每次总是从无序区中选择最小的一个排到左侧,插入排序有序区中的元素位置是暂时的,只有排序完成后,才是固定的。
- 在插入排序排序后,原序列中相等元素的相对位置保持不变,所以它是稳定的排序,而选择排序则不然。