八种基本的排序(3)——插入排序(C语言实现)

-

八种基本的排序(1)——冒泡排序(C语言实现)

八种基本的排序(2)——直接选择排序(C语言实现)

八种基本的排序(3)——插入排序(C语言实现)

八种基本的排序(4)——归并排序(C语言实现)


目录


直接插入排序(Insertion sorting)

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


基本思想

直接插入排序是一种简单的插入排序法,每步把待排序的记录按其关键码值的大小逐个插入到一个前面已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。


原理

将n个元素的数列分为已有序和无序两个部分,
插入排序过程示例如下所示:
a 1 a 2 a 3 a 4 a n
a 1 a 2 a 3 a 4 a n

a 1 ( n 1 a 2 ( n 1 ) , a n ( n 1 )
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
假设在一个无序的数组中,要将该数组中的数按插入排序的方法从小到大排序。假设 a [ ] = 3 , 5 , 2 , 1 , 4 ;插入排序的思想就是比大小,满足条件交换位置,一开始会像冒泡排序一样,但会比冒泡多一步就是交换后( a [ i ] = a [ i + 1 ] 后)原位置( a [ i ] )会继续和前面的数比较满足条件交换,直到 a [ i + 1 ] 前面的数组是有序的。比如在第二次比较后数组变成 a [ ] = 2 , 3 , 5 , 1 , 4 ;


下面就是源代码了

源代码

函数版

//插入排序(从小到大) 
#include<stdio.h>
int number[100000000];     //在外面定义数组 
void insertion_sort(int *number,int n)    //定义一个插入函数"insertion_sort" 
{
    int i=0,ii=0,temp=0;  
    for(i=1;i<n;i++)  //循环遍历 
    {
        temp=number[i];  //将temp每一次赋值为number[i] 
        ii=i-1;  
        while(ii>=0&&temp<number[ii])   //这里改顺序 (temp后的)"<"为小到大,">"为大到小 !!!
        {
            number[ii+1]=number[ii];    //将大的元素往前放 
            ii--; 
        }
        number[ii+1]=temp;   //与"number[ii+1]=number[ii];"一起意为 
    }              //如果插入的数比之前的大,将number[ii]与number[ii+1]互换 
}
int main() 
{
    int i=0,n;
    printf("输入数字个数:\n");    
    scanf("%d",&n);       //输入要排序的数字的个数 
    printf("输入%d个数:\n",n);
    for(int j=0;j<n;j++)       //将所有数全放入number数组中 
        scanf("%d",&number[j]) ;
    insertion_sort(number,n);   //引用插入函数 
    for(i=0;i<n-1;i++)    //循环输出 
        printf("%d ",number[i]);    //格式需要  
    printf("%d\n",number[i]);
    return 0;
}

普通版

//插入排序(从小到大) 
#include<stdio.h>
int number[100000000];     
int main() 
{
    int i=0,n,ii=0,temp=0;
    printf("输入数字个数:\n");    
    scanf("%d",&n);       
    printf("输入%d个数:\n",n);
    for(int j=0;j<n;j++)       
        scanf("%d",&number[j]) ;
    for(i=1;i<n;i++)  
    {
        temp=number[i]; 
        ii=i-1;  
        while(ii>=0&&temp<number[ii])   //在这里改顺序 !!!
        {
            number[ii+1]=number[ii];   
            ii--; 
        }
        number[ii+1]=temp;   
    }                
    for(i=0;i<n-1;i++)    
        printf("%d ",number[i]);   
    printf("%d\n",number[i]);
    return 0;
}

希望大家喜欢这篇文章!!!
如有问题请留言,谢谢!!!

>>>我的博客<<<

猜你喜欢

转载自blog.csdn.net/sty20030818/article/details/81139164