您的位置:首页 > 移动开发 > 微信开发

每天一个小程序(10)——直接插入排序

2014-03-25 10:57 267 查看
插入排序的基本思想:

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置

算法是这样的,数组的第0位为保存带记录的R[i]的值,以免在移动中被覆盖而丢失。从第2位开始将元素暂存在R[0]中,从第2位前面开始比较,若R[0]小于R[1],将R[1]后移到R[2]中,位置标记j 前移,直到没有比R[0]大的值后,将R[0]放到R[j+1]中,这样就完成了一趟比较,R[1]和R[2]为有序的,接下来i++,进行下一趟排序。

首先是顺序表排序

//顺序表插入排序
void ins_sort(datatype1 R[],int n)
{
int i,j;
for(i = 2; i <= n; i++)
{
R[0] = R[i];
j = i - 1;
while(R[0].key < R[j].key)//比较R[0]和j值
{
R[j+1] = R[j];//若小于,则j值后移
j--;
}
R[j+1] = R[0];
}
}


链表插入排序,链表函数参考双链表,传送门双向链表

//链表插入排序
void ins_sort2(DuLinkList L)
{
DuLinkList p = L->next->next;
datatype data;
DuLinkList q;
while(p != L)
{
data = p->data;
q = p->prior;
while(data < q->data)
{
q->next->data = q->data;
q = q->prior;
}
q->next->data = data;
p = p->next;
}
}


算法分析
稳定性:稳定的

时间复杂度:O(n^2)

最快的情况:正序

最慢的情况:逆序

趟数为n-1趟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐