9 排序

本文详细介绍了多种排序算法,包括内部排序(如快速排序、插入排序)、外部排序策略、以及不同类型的插入排序(如折半、表)、希尔排序、冒泡排序、堆排序、选择排序和归并排序,讨论了它们的时间复杂度、空间复杂度以及稳定性,并提到了基数排序和多关键字排序的方法。
摘要由CSDN通过智能技术生成
  1. 排序

    1. 内部排序 (不需要访问外存)
    2. 外部排序 (排序数量大 不可能在内存完成)
  2. 插入排序

    1. 直接插入排序
    2. 折半插入 (二分)
    3. 表插入 (链表存储)
    4. 希尔排序 shell (基于逐趟缩小增量)
  3. 快速排序

    1. 冒泡排序

    2. 一趟快速排序

    3. 快速排序

      void quick_sort(int a[],int l,int r)
      {
          if(l>=r) return;
          int x = a[(l+r)/2]; // int x = a[l+r >> 1];
          int i = l-1;
          int j = r+1;
          while(i<j)
          {
              do i++;
              while(a[i]<x);
              
              do j--;
              while(a[j]>x);
              
              if(i<j) swap(a[i],a[j]);
          }
          quick_sort(a,l,j);
          quick_sort(a,j+1,r);
      }
      
  4. 堆排序

    1. 堆排序
    #include <queue>
    #include <vector>
    
    priority_queue<int,vector<int>,greater<int>> heap;//小根堆
    priority_queue<int,vector<int<,less<int>> heap1;//大根堆
    
    heap.push(x);//入堆
    heap.top();//堆顶
    heap.pop();//删除堆顶
    
    1. 简单选择排序
  5. 归并排序

    void merge_sort(int a[],int l,int r)
    {
        if(l>=r) return;
        
        int mid = (l+r) / 2; // int mid = (l+r) >> 1;
        merge_sort(a,l,mid);
        merge_sort(a,mid+1,r);
        
        int k = 0;
        int i = l;
        int j = mid+1;
        
        while(i<=mid && j<=r)
        {
            if(a[i]<a[j]) temp[k++] = a[i++];
            else temp[k++] = a[j++];
        }
        
        while(i<=mid) temp[k++] = a[i++];
        
        while(j<=r) temp[k++] = a[j++];
        
        for(i=l,j=0;i<=r;i++,j++)
        {
            a[i] = temp[j];
        }
    }
    
  6. 基数排序

    1. 多关键字的排序
      1. 最高位优先MSD法
      2. 最低位优先LSD法
    2. 链式基数排序
  7. 利用结构体实现多关键字的排序

    struct R
    {
        string name;//姓名
        int age,id;//年龄 工号
        bool operator<(const R&t) const
        {
            if(age != t.age) return age < t.age;//先按照年龄从小到大排序
            else
            {
                if(name != t.name) return name < t.name;//年龄相同则按照姓名字典序排序
                else return id < t.id;//年龄姓名相同则按照工号从小到大排序
            }
        }
    }r[N];
    
  8. 各种排序比较

    1. 时间复杂度:

      O(nlogn)O(n^2)O(n)
      快速排序直接插入排序基数排序
      堆排序冒泡排序若有序:直接插入排序
      归并排序简单选择排序若有序:冒泡排序
      若有序:快速排序
    2. 空间复杂度

      O(1)O(logn)O(n)O(rd)
      所有的简单排序方法:(3个)快速排序归并排序链式基数排序
      直接插入
      冒泡
      简单选择
      堆排序
    3. 稳定性

      -稳定概念:对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变

      -不稳定的有:快速排序 堆排序 shell希尔排序

  9. 外部排序:多路归并

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cwn_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值