排序问题——晴问题库

排序问题——晴问题库

排序问题是线性数据的常考问题,在解晴问题库时总结归纳以下关于排序的解题方法和思路。
感谢晴神

排序问题是数据结构中十分重点的一部分。
可以分为五个大部分:

  1. 插入排序
  2. 选择排序
  3. 交换排序
  4. 基数
  5. 归并

再具体往下分:

  1. 插入排序:
  • 直接插入:顺or链,稳定
  • 折半插入:顺,稳定
  • 希尔:顺,不稳定
  1. 选择排序:
  • 直接选择排序:顺,不稳定
  • 树选:顺,不稳定
  • 堆排:顺,不稳定
  1. 交换排序:
  • 冒泡:顺or链,稳定
  • 快排:顺or链,不稳定
  1. 基数:顺,稳定
  2. 归并:顺,稳定

其中快排是相对来说最经常在综合题中使用的方法。
无序变为有序会使许多看似复杂的问题简单化。

下面以晴问题库为总结基准

排序问题

    • 排序问题——晴问题库
    • 一、插入排序
      • 1. 直接插入
      • 2. 折半插入
      • 3. 希尔
    • 二、选择排序
      • 1. 直接选择
      • 2. 堆排
    • 三、交换排序
      • 1. 冒泡排序
      • 2. 快排
    • 四、基数
    • 五、归并

一、插入排序

1. 直接插入

2. 折半插入

3. 希尔

二、选择排序

1. 直接选择

2. 堆排

三、交换排序

1. 冒泡排序

冒泡排序的基本思想是,将数组划分为尚未有序的部分(左边)和已经有序的部分(右边),每一轮从左到右遍历尚未有序部分的元素,判断相邻两个元素的大小,如果左大右小,那么就交换这两个元素,这样一直交换,直到把尚未有序部分中的最大元素交换到尚未有序部分的最右边。由于这个最大元素一定比已经有序的部分中的所有元素小,所以不必再继续和已经有序的部分比较了,这个元素在下一轮中视为在已经有序的部分中。

简单来说,就是通过交换整理前半部分,后半部分不断增加,前部分不断减少。

#include
#include
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. 快排

四、基数

五、归并

将继续更新

你可能感兴趣的:(笔记,排序算法,算法)