直接插入排序(C语言简单实现)
本文参考自《大话数据结构》
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录新增1的有序表。
/* 对顺序表L作直接插入排序 */
void InsertSort(SqList *L){
int i, j;
for(i=2;i<=L->length;i++){
if(L->r[i] < L->r[i-1]){ //需将L->r[i]插入有序子表
L->r[0] = L->r[i]; //设置哨兵
for(j = i-1;L->r[j] > L->r[0];j--)
L->r[j+1] = L->r[j]; //记录后移
L->r[j+1] = L->r[0]; //插入到正确位置
}
}
}
复杂度分析
空间上:一个记录的辅助空间
时间上:最好情况是排序表本身有序,共比较n-1次,没有移动记录,所以时间复杂度为O(n);最坏情况是排序表是逆序的,此时比较的次数达到(n+2)*(n-1)/2,而移动次数达到最大值(n+4)*(n-1)/2次。
如果排序记录是随机的,那么按照概率相同原则,平均比较和移动次数约n^2/4,此时直接排序法的时间复杂度为O(n^2)。虽然都是O(n^2),但是性能上比选择排序好。
例子

从下标2开始,如果当前要排序的数据,比前一个数据小,那么将哨兵(下标0)值设置为当前要排序的数据,然后每次比较,如果比哨兵值小,那么当前位置的数值后移一位,直到没有数比哨兵的值小,得到的就是排好序的数组。
简单实现
#include <stdio.h>
#include <stdlib.h>
#define MAX 11 //数组最大长度为10
struct SqList{
int r[MAX];
int length;
};
/* 直接插入排序 */
void InsertSort(SqList* L){
int i, j;
for(i=2;i<=L->length;i++){
if(L->r[i] < L->r[i-1]){ //L->r[i]为需要插入的数据,i之前的都已经是有序的了,从小到大
L->r[0] = L->r[i]; //设置哨兵
for(j=i-1;L->r[j]>L->r[0];j--)
L->r[j+1] = L->r[j]; //如果,L->r[j]小于要插入的数据,那么r[j]记录后移1位,放到r[j+1]
L->r[j+1] = L->r[0]; //插入到正确位置
}
}
}
int main(){
int i;
SqList* L = (SqList*)malloc(sizeof(SqList));
L->length = MAX;
int a[11] = {5,9,7,8,1,4,3,0,6,2,10}; //第一位是哨兵
for(i=0;i<MAX;i++)
L->r[i] = a[i];
InsertSort(L);
for(i=0;i<MAX;i++)
printf("%d ",L->r[i]);
printf("\n");
return 0;
}
结果


直接插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。本文详细介绍了其复杂度分析,并给出了C语言实现的简单例子。
1万+

被折叠的 条评论
为什么被折叠?



