简单排序 插入排序详解 C语言入门

欢迎关注笔者,你的支持是持续更博的最大动力

目录

  • 问题描述
  • 思路
  • 代码
  • 相关内容
  • 其他

问题描述

给n个数按从小到大排序 (插入排序)

思路

简单排序 插入排序详解 C语言入门_第1张图片

插入排序:把无序部分元素插入有序部分
1.用无序部分的第1个元素,和前面有序部分每一个元素比较;
2.如果比前面有序部分某元素小,则插到那个元素前面;

直到最后一个元素排完。


关于怎么插入:
简单排序 插入排序详解 C语言入门_第2张图片
简单排序 插入排序详解 C语言入门_第3张图片


代码

代码思路

因为位置1是第一个无序元素 (位置0不用排,有序),所以从位置1开始排序:

  • 和前面有序部分每一个元素比较;
  • 如果比前面有序部分位置 j 元素小,则插到那个元素前面:
    – 把这个无序元素放到临时位,空出位置
    – 把位置 j 往后的有序元素,倒着依次往后挪一位
    – 无序元素插入位置 j
    简单排序 插入排序详解 C语言入门_第4张图片
void InsertionSort(int a[], int size){           //a[]:要排序的数组,size:数组大小,函数返回值:无,类型写void
    for (int i = 1; i < size; ++i) {             //无序部分:i~(size-1)
        for (int j = 0; j < i; ++j) {            //有序部分:0~(i-1)
            if (a[j] > a[i]){                    //如果位置j的有序元素比无序元素i大,i元素就要排到j对应的元素前面,且因为有序,i不用再和j后面的有序部分比较了,它们一定比i元素大
                int tmp = a[i];                  //先把原i位置无序元素放到临时位
                for (int k = i; k > j; --k) {   //再把从j到i-1的有序元素倒着依次往后挪一位:如起始位置i-1的元素挪到i,即a[i]=a[i-1]
                    a[k] = a[k-1];
                }
                a[j] = tmp;                      //挪完后,临时位的无序元素插入有序部分j位置
                break;                           //j后面的有序部分一定比a[i]大,就不用比较了
            }
        }
    }
}
//用插入排序函数InsertionSort给 3 2 1 5 排序, 输出: 1 2 3 5
int main(){
    int a[] = {3,2,1,5};
    InsertionSort(a, 4);
    for (int i = 0; i < 4; ++ i) {
        cout << a[i] << " ";    
    }
}

相关内容

  • 选择排序
  • 冒泡排序
  • 用sort库函数进行自定义排序

其他

日常vlog: 点这里去B站~


你可能感兴趣的:(C入门,c语言,排序算法,数据结构)