直接插入排序
基本思想:如上图所示的一组序列为6、5、3、1、8、7、2、4,首先6和5比较,6比5大交互位置,接着3和5比较,6比3大交互位置,3和5比,交互位置,现在的序列就是3、5、6、1、8、7、2、4,这个时候要把1插入到序列中,首先在序列中查找以确定1所应插入的位置,然后就行插入操作,从6起向左顺序查找,由于1小于3,所以1插入的位置就是3的前面,一般情况下,第i(i大于等于1)个记录进行插入操作时,R1、 R2,…,是排好序的有序数列,取出第i个元素,在序列中找到一个合适的位置并将她插入到该位置上即可。
复杂度和稳定性情况:
- 最好的时间复杂度:O(n)
- 最坏的时间复杂度:O(n²)
- 平均的时间复杂度:O(n² )
- 空间复杂度:O(1)
- 稳定性:稳定
C实现代码如下:
/**
* 插入排序步骤
*
* 1、从第一个元素开始,该元素可以认为已经被排序
* 2、取出下一个元素,在已经排序的元素序列中从后向前扫描
* 3、如果该元素(已排序)大于新元素,将该元素移到下一位置
* 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
* 5、将新元素插入到该位置中
* 6、重复步骤2
* 7、排序完成
*/
#include<stdio.h>
void InsertSort(int a[], int n) //a[]接受数组首地址,n为数组大小
{
int i, j;
int temp;
for(i = 0; i < n-1; ++i) //默认第一个元素有序
{
temp = a[i+1]; //temp标记有序序列的下一个元素,
j = i; //即将标记值存放在临时变量内,
while(j > -1 && temp < a[j]) //若标记的元素小于前一个元素,
{ //前一个元素(大的元素)后移,
a[j+1] = a[j]; //所有比标记值大的元素全部后移,
j--;
}
a[j+1] = temp; //将标记值插入到相应位置,使得序列有序
}
}
int main()
{
int arr[] = {6,5,3,1,8,7,2,4};
int n = sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,n);
for(int i = 0; i < n; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
其他排序算法: