排序算法
├── 插入排序类 (核心:将元素插入到已有序的序列中)
│ ├── 直接插入排序
│ ├── 折半插入排序
│ └── 希尔排序 (本质:多次分组插入排序)
│
├── 交换排序类 (核心:通过比较并交换元素位置来排序)
│ ├── 冒泡排序
│ └── 快速排序
│
├── 选择排序类 (核心:在待排序列中选出最值,放到最终位置)
│ ├── 简单选择排序 (直接选最值)
│ └── 堆排序 (利用堆结构选最值) ←── 这里补上你问的“选择排序”
│
├── 归并排序类 (核心:将两个有序子序列合并成一个整体)
│ └── 二路归并排序 (多路归并是其变种)
│
└── 分配排序类 (核心:利用“多关键字”分配和收集,不依赖比较) ←── 这里补上你问的“基数排序”
└── 基数排序 ( LSD / MSD )
- 插入排序类:
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)若不是最大,则吧已排序区的数据(被比较的那个)在已排序区向右移动
思想(手拿卡牌,摸排插入,引入位置信息)