排序类...

复制代码
排序算法
├── 插入排序类 (核心:将元素插入到已有序的序列中)
│   ├── 直接插入排序
│   ├── 折半插入排序
│   └── 希尔排序 (本质:多次分组插入排序)
│
├── 交换排序类 (核心:通过比较并交换元素位置来排序)
│   ├── 冒泡排序
│   └── 快速排序
│
├── 选择排序类 (核心:在待排序列中选出最值,放到最终位置)
│   ├── 简单选择排序 (直接选最值)
│   └── 堆排序 (利用堆结构选最值)   ←── 这里补上你问的“选择排序”
│
├── 归并排序类 (核心:将两个有序子序列合并成一个整体)
│   └── 二路归并排序 (多路归并是其变种)
│
└── 分配排序类 (核心:利用“多关键字”分配和收集,不依赖比较)  ←── 这里补上你问的“基数排序”
    └── 基数排序 ( LSD / MSD )
  1. 插入排序类:

https://blog.csdn.net/2301_80191662/article/details/142300973?ops_request_misc=elastic_search_misc&request_id=90acca799823806d96bd5278543bf258&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-142300973-null-null.142^v102^control&utm_term=%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E7%9A%84%E5%8A%A8%E7%94%BB%E6%BC%94%E7%A4%BA&spm=1018.2226.3001.4187

复制代码
void insertion_sort(int arr[], int len){
        int i,j,key;
        for (i=1;i<len;i++){
                key = arr[i];
                j=i-1;
                while((j>=0) && (arr[j]>key)) {
                        arr[j+1] = arr[j];
                        j--;
                }
                arr[j+1] = key;
        }
}

核心思想: 划分已排序区(默认第一个数据为已排序区) 和 未排序区,每次从未排序区的末尾找到一个数据存放于key ,并与 已排序区的数据依次比较

1)1.从大到小依次比较,

2)默认放在最后一个;

3)若不是最大,则吧已排序区的数据(被比较的那个)在已排序区向右移动

思想(手拿卡牌,摸排插入,引入位置信息)