排序算法大集锦_插入类——直接插入排序

来源:互联网 发布:linux解压bz2文件 编辑:程序博客网 时间:2024/06/08 19:15

这一系列博客的特点就是——给出每趟排序的结果


本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好。《算法导论》上面那个比喻,比做打扑克牌的插入新牌,就比较形象。所以这些博客就算是对自己的总结吧。


#include <stdio.h> void InsertSort(int *m, int n){    int i,j,temp;    for(i=1;i<n;i++)    {        temp=m[i];        j=i-1;        while(j>=0 && temp<m[j])        {            m[j+1]=m[j];            j--;        }        m[j+1]=temp;                for(int t=0;t<10;t++)            printf("%d ",m[t]);        printf("\n");     }} int main(){    int i;     int a[10]={2,8,5,7,4,3,1,9,6,10};     for(i=0;i<10;i++)        printf("%d ",a[i]);     printf("\n排序后\n");     InsertSort(a,10);     for(i=0;i<10;i++)        printf("%d ",a[i]);     printf("\n");     return 0;}




等下。。。。还没结束!!!

最后3行已经排好序了,却依然没有停止。


改进一下sort算法


void InsertSort(int *m, int n){    int i,j,temp;    bool flag;    for(i=1;i<n;i++)    {        temp=m[i];        j=i-1;        flag=false;        while(j>=0 && temp<m[j])        {            flag=true;            m[j+1]=m[j];            j--;        }        m[j+1]=temp;                for(int t=0;t<10;t++)            printf("%d ",m[t]);        printf("\n");        if(flag)            break;    }}





结果是错的,因为直接插入排序过程中,可能有一两趟并没有交换值。这不同于冒泡排序!


由此可见,要想优化算法,必须切合实际情况作分析。


1 0