在网站开发中进行用户管理站点搜索
排序问题——晴问题库
排序问题是线性数据的常考问题,在解晴问题库时总结归纳以下关于排序的解题方法和思路。
感谢晴神
排序问题是数据结构中十分重点的一部分。
可以分为五个大部分:
- 插入排序
- 选择排序
- 交换排序
- 基数
- 归并
再具体往下分:
- 插入排序:
- 直接插入:顺or链,稳定
- 折半插入:顺,稳定
- 希尔:顺,不稳定
- 选择排序:
- 直接选择排序:顺,不稳定
- 树选:顺,不稳定
- 堆排:顺,不稳定
- 交换排序:
- 冒泡:顺or链,稳定
- 快排:顺or链,不稳定
- 基数:顺,稳定
- 归并:顺,稳定
其中快排是相对来说最经常在综合题中使用的方法。
把无序变为有序会使许多看似复杂的问题简单化。
下面以晴问题库为总结基准
排序问题
- 排序问题——晴问题库
- 一、插入排序
- 1. 直接插入
- 2. 折半插入
- 3. 希尔
- 二、选择排序
- 1. 直接选择
- 2. 堆排
- 三、交换排序
- 1. 冒泡排序
- 2. 快排
- 四、基数
- 五、归并
一、插入排序
1. 直接插入
2. 折半插入
3. 希尔
二、选择排序
1. 直接选择
2. 堆排
三、交换排序
1. 冒泡排序
冒泡排序的基本思想是,将数组划分为尚未有序的部分(左边)和已经有序的部分(右边),每一轮从左到右遍历尚未有序部分的元素,判断相邻两个元素的大小,如果左大右小,那么就交换这两个元素,这样一直交换,直到把尚未有序部分中的最大元素交换到尚未有序部分的最右边。由于这个最大元素一定比已经有序的部分中的所有元素小,所以不必再继续和已经有序的部分比较了,这个元素在下一轮中视为在已经有序的部分中。
简单来说,就是通过交换整理前半部分,后半部分不断增加,前部分不断减少。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXV=100;
int a[MAXV];int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}//核心部分!!for(int i=1;i<n;i++){for(int j=0;j<n-i;j++){if(a[j]>a[j+1]){swap(a[j],a[j+1]);}}}for(int i=0;i<n-1;i++){printf("%d ",a[i]);}printf("%d",a[n-1]);return 0;
}
2. 快排
四、基数
五、归并
将继续更新