C直接插入排序 主函数调用

C直接插入排序 主函数调用

先上代码,排序可视化:
https://visualgo.net/zh/sorting

#include <stdio.h>
void Printarr(int arr[], int length);   // print arrary
void InsertSort(int arr[], int length); // sort
int main(int argc, char const *argv[])
{
    int arr[] = {45, 29, 40, 25, 98, 77, 46, 20, 21, 21};
    int length = sizeof(arr) / sizeof(arr[0]);
    Printarr(arr, length);
    InsertSort(arr, length);
    puts("finish sort!");
    Printarr(arr, length);

    return 0;
}

void Printarr(int arr[], int length)
{
    int i;
    for (i = 0; i < length; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

void InsertSort(int arr[], int length)
{
    int i, j, temp;
    // 此时的array[0]作为已排序位置
    // 遍历所有无序元素,从下标1开始
    for (i = 1; i < length; i++)
    {
        temp = arr[i]; // 需要插入到前面的 无序元素
        j = i - 1; // 已排序的最后一个元素下标

        while (j >= 0 && arr[j] > temp)
        {
            arr[j + 1] = arr[j]; // 将已排序的元素右移
            j--;    // 继续向前对比
        }

        // 在适当位置插入
        arr[j + 1] = temp;
    }
}

其中while循环还可以写成for形式:

void InsertSort(int arr[], int length)
{
   int i,j,temp;
   for(i=1;i<length;i++){
       temp = arr[i];   // unsort element
       for(j=i-1;j>=0&&arr[j]>temp;j--){
           arr[j+1] = arr[j];
       }
       arr[j+1] = temp;
   }
}

result:

45 29 40 25 98 77 46 20 21 21
finish sort!
20 21 21 25 29 40 45 46 77 98

伪代码思路:

在这里插入图片描述

伪代码
假设第一个元素认为已排序,
遍历剩余未排序的元素
提取第一个未排序的元素作为临时变量temp
遍历已排序的元素,将其和temp做比较,如果temp小于排序的元素,就将排序的元素右移给temp空出位置。
当遇到temp大于已排序的元素时,插入到当前位置。

注意:
其中内循环需要遍历已排序的元素,从后往前遍历,找到比temp小的元素,然后插入到前面,其中需要不断将比temp大的元素往右移,之前temp的位置会被最后一个已排序的元素所替代。

时间复杂度:直接插入排序和冒泡排序、选择排序的平均时间复杂度一样都是O(N^2);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值