插入排序(c实现)

插入排序, 算法复杂度为o(n^2)



博主觉得插入排序就像是我们打扑克的时候,假设手中的牌是有序的,而下面摸得排是无序的,那么 当我们拿一个牌后,假设这个牌是有序的,接着拿第二个牌,比较抽起的牌和手中有序牌,从后往前比较,当比手中有序的牌小的是时候,就找到了这个牌应该插入的位置。



下面是《数据结构与算法分析》中的描述:插入排序由N-1趟排序组成,对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。在第P趟,我们将位置P上的元素向左移动到它在前p+1个元素中的正确位置上去。从有序序列的最后一个元素开始查找,边查找边移动元素,而不是先找到插入位置再移动元素,这样提高了效率。


看下面这个例子:

原始数组为:a[6]=[34,8,64,51,32,21]

则插入排序每次的变化如下:

初始34864513221移动位置
p=1834645132211
p=2834645132210
p=334516432211
p=4832345164213
p=521323451644


代码实现:

#include<stdio.h>
#include<stdib.h>
void InsertionSort(int arr[].int N)
{int p,j;
 int temp;
for(p=1;p<N;p++)/*第P趟,把第P个元素后的无序元素和前P-1个有序元素作比较*/
{temp=arr[p];
for(j=p-1;j>0&&arr[j]>temp;j--)
{arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}
int main()  
{  
    int array[] = {5, 15, 3, 20, 11};  
    InsertionSort(array, sizeof(array)/sizeof(int));  
    for(int i = 0; i < 5; ++i)  
        printf("%d ", array[i]);  
    printf("\n");  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值