插入排序(c实现)

来源:互联网 发布:券老大淘宝优惠券 编辑:程序博客网 时间:2024/06/06 09:11

插入排序, 算法复杂度为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=1834645132211p=2834645132210p=38 34516432211p=4832345164213p=58 21323451644

代码实现:

#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");  
}  

0 0