排序问题——晴问题库
排序问题是线性数据的常考问题,在解晴问题库时总结归纳以下关于排序的解题方法和思路。
感谢晴神
排序问题是数据结构中十分重点的一部分。
可以分为五个大部分:
- 插入排序
- 选择排序
- 交换排序
- 基数
- 归并
再具体往下分:
- 插入排序:
- 直接插入:顺or链,稳定
- 折半插入:顺,稳定
- 希尔:顺,不稳定
- 选择排序:
- 直接选择排序:顺,不稳定
- 树选:顺,不稳定
- 堆排:顺,不稳定
- 交换排序:
- 冒泡:顺or链,稳定
- 快排:顺or链,不稳定
- 基数:顺,稳定
- 归并:顺,稳定
其中快排是相对来说最经常在综合题中使用的方法。
把无序变为有序会使许多看似复杂的问题简单化。
下面以晴问题库为总结基准
排序问题
algotithm的sort方法
sort(起始,结尾)。默认从小到大。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=10;
int a[MAXN];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i<n-1) printf(" ");
}
return 0;
}
可以通过以下操作,变为从大到小
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=10;
int a[MAXN];
bool cmp(int a, int b) {
return a > b;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i<n-1) printf(" ");
}
return 0;
}
一、插入排序
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. 快排
四、基数
五、归并
将继续更新