当前位置: 首页 > news >正文

精简易懂的快速排序,插入排序,大顶堆排序

#include <iostream>
using namespace std;
 
//快速排序,在子函数中,数组已被改变
void quick_sort(int *a, int left, int right) //left和right为索引值
{
    int temp; //存储每次选定的基准数(从最左侧选基准数)
    int t;
    int initial=left;
    int end=right;
    temp=a[left];
 
    //***必须有这一部分***//
    if (left>right)  //因为在递归过程中有减1加1的情况,当其越界时,直接return,不返回任何值,即结束当前程序块
        return;   
 
    while(left!=right)  //此时左右index在移动中,若left==right,则跳出循环,将基数归位
    {
        while(a[right]>=temp && left<right)  //直到找到小于基准数的值为准
            right--;
        while(a[left]<=temp && left<right)
            left++;
        if(left<right)  //交换左右两侧值,当left=right时,跳出外层while循环
        {
            t=a[right];
            a[right]=a[left];
            a[left]=t;

        }    
    }
  
    a[left]=temp;        //基数归位
 
    //递归处理归位后的基准数的左右两侧
    quick_sort(a,initial,left-1);  //此时left=right
    quick_sort(a,left+1,end);
}

颜色之间是对应关系,明白的一看就懂了。

 

插入排序:

void InsertSort(int arr[],int n){
    for (int i =1;i <= n;++i){
        for(int j = i;j > 0;--j){
            if(arr[j] < arr[j -1]){
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }}}}

冒泡排序:

void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {

            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }}}}

 

 

 

最后,当然排序最省力的就是C++中的自定义排序了,直接用algorithm中的sort即可。

 

#include <algorithm>
bool cmp(int a,int b){
    return a>b; 
}

sort(a,a+n); //a为数组,n为数组的长度,默认是从小到大排序
sort(a,a+n,cmp);//cmp即为自定义比较函数,此处是从大到小排序。

 

大顶堆实现:

来看一下实现

//堆排序
void HeapSort(int arr[],int len){
    int i;
    //初始化堆,从最后一个父节点开始
    for(i = len/2 - 1; i >= 0; --i){
        Heapify(arr,i,len);
    }
    //从堆中的取出最大的元素再调整堆
    for(i = len - 1;i > 0;--i){
        int temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
        //调整成堆
        Heapify(arr,0,i);
    }
}

再看 调整成堆的函数

void Heapify(int arr[], int first, int end){
    int father = first;
    int son = father * 2 + 1;
    while(son < end){
        if(son + 1 < end && arr[son] < arr[son+1]) ++son;
        //如果父节点大于子节点则表示调整完毕
        if(arr[father] > arr[son]) break;
        else {
         //不然就交换父节点和子节点的元素
            int temp = arr[father];
            arr[father] = arr[son];
            arr[son] = temp;
            //父和子节点变成下一个要比较的位置
            father = son;
            son = 2 * father + 1;
        }
    }
}

堆排序的时间复杂度最好到最坏都是O(nlogn),较多元素的时候效率比较高

 

 

相关文章:

  • 线性表结构体有两种方式; 指针指向一维数组 ElemType在c中使用 结构体解释: 结构体别名LNode和*LinkList区别; c++ new关键字; 树的结构: 递归实现求数的高
  • 计算机原理中的位向量表示集合的原理是什么
  • 为什么价值增殖过程不外是超过一定点而延长了的价值形成过程
  • 绝对剩余价值和相对剩余价值举例
  • 偶然性背后总是隐藏着必然性
  • 价值规律的作用是什么
  • 马哲概述 如何理解商品的使用价值与价值以及货币,纸币
  • 法律权利与法律义务的二重性
  • 懒惰的身体,要求快反馈饥渴,缩短周期的手段就是快满足,这是互联网产品吸精之处
  • 人脉基于价值互换。当自身没有足够价值时,所谓的“人脉”等同于无效。快满足无意义,等同慢性自杀。
  • 我们被 奶头乐理论 死死的抓住
  • 人生何尝不是在做选择题,简单的显然易见的选相比觉着会是正确的吗
  • 从“读万卷书”到“行万里路”,如何做到知行合一
  • 不定积分基本公式
  • Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【翻译】babel对TC39装饰器草案的实现
  • 230. Kth Smallest Element in a BST
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • canvas 绘制双线技巧
  • Github访问慢解决办法
  • Java 最常见的 200+ 面试题:面试必备
  • js ES6 求数组的交集,并集,还有差集
  • Node项目之评分系统(二)- 数据库设计
  • vue--为什么data属性必须是一个函数
  • Wamp集成环境 添加PHP的新版本
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 嵌入式文件系统
  • 入门到放弃node系列之Hello Word篇
  • 删除表内多余的重复数据
  • 通过git安装npm私有模块
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (12)Linux 常见的三种进程状态
  • (14)Hive调优——合并小文件
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (floyd+补集) poj 3275
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (超详细)语音信号处理之特征提取
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET CORE Aws S3 使用
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 使用 XPath 来读写 XML 文件
  • .NET6实现破解Modbus poll点表配置文件
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .Net开发笔记(二十)创建一个需要授权的第三方组件