Linux C直接插入排序算法实现

直接插入排序思想是将待排序元素一个一个插入到已排序队列:由于一个元素不存在排序,因此从第二个元素起,将第二个元素之前的元素(也就是第一个元素)看成是已排序队列,将第二个元素与已排序队列比较,找到合适位置并插入;依此类推,将剩下元素插入到已排序队列,完成排序。

 

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

稳定性:稳定

 

注:时间复杂度与选择(冒泡)排序一样,而代码逻辑看起来比选择(冒泡)排序难理解。

 

测试结果:

    待排序:6    3    4    2    5    1

    升序:1    2    3    4    5    6

   降序: 6    5    4    3    2    1

   

源码(insert_sort.c):

#include <stdio.h>

#define ARRAY_N 6

int array[ARRAY_N]={6, 3 , 4, 2, 5, 1};


int show_list(int array[], int n)
{
    int i = 0;

    for (i=0; i < ARRAY_N; i++)
    {

        printf("%5d", array[i]);
    }

    printf("\n");

    return 0;
}

int insert_sort_asc(int array[], int n)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int tmp = 0;

    for (i = 1; i < n; i++)
    {
        for (j = i - 1; j >=0; j--)
        {
            if (array[i] > array[j])
            {
                break;
            }
        }

        if (j != i - 1)
        {
            tmp = array[i];
            for (k = i - 1; k > j; k--)
            {
                array[k + 1] = array[k];
            }

            array[k + 1] = tmp;
        }

    }



    printf("\n");

    return 0;
}


int insert_sort_des(int array[], int n)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int tmp = 0;

    for (i = n - 2; i >=0 ; i--)
    {
        for (j = i + 1; j < n; j++)
        {
            if (array[i] > array[j])
            {
                break;
            }
        }

        if (j != i + 1)
        {
            tmp = array[i];
            for (k = i + 1; k < j; k++)
            {
                array[k - 1] = array[k];
            }

            array[k - 1] = tmp;
        }

    }


    printf("\n");

    return 0;
}

int main(void)
{
    show_list(array, ARRAY_N);

    insert_sort_asc(array, ARRAY_N);

    show_list(array, ARRAY_N);

    insert_sort_des(array, ARRAY_N);

    show_list(array, ARRAY_N);

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪游东戴河

你就是这个世界的唯一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值