冒泡排序

// 时间复杂度n2int i=0,j=0;for(i=0;i<sz;i++){// 时间复杂度n2,优化,如果一趟冒泡排序没有变化说明已经拍好序了int exchange = 1;for(j=0;j<sz-i-1;j++){int temp = 0;if(a[j]>a[j+1]){temp = a[j];a[j] = a[j+1];a[j+1] = temp;exchange =0;}}if(exchange)break;}

选择排序

原理:先假设0下标数是最小的,然后依次把从1下标数到列表结尾的数和他进行比较找出最小数把下标存起来,然后把0下标的数和最小数下标数进行交换,依次这样找出最小数放到有序区

void select_sort(int arr[],int sz)
{// 时间复杂度n2int n,j;for(n=0;n<sz-1;n++){int min_loc = n; // 假设最小的下标是nfor(j=n+1;j<sz;j++) // 循环从 第一个到列表结尾{if(arr[j]<arr[min_loc]) // 找出最小数,把最小数下标存入min_loc里面{min_loc = j;}}// 把找出到的最小数和第0个数交换位置int temp = arr[n]; arr[n] = arr[min_loc];arr[min_loc] = temp;}
}

插入排序

原理:和摸牌一样,假设0下标的数是手里的牌,然后依次从下标1到结尾进行摸牌,摸过来的数,要是比手里这个数小,然后就把手里这个数位置像后移动,然后在插入进去

void insert_sort(int arr[],int sz)
{ // 时间复杂度n2int i,j;for(i=1;i<sz;i++) // i表示摸到的牌的下标{int tem = arr[i]; // 摸到的牌j = i-1; // j指的是手里的牌的下表while (j>=0 && arr[j]>tem) // 手里的牌大于摸到的牌,就把手里的牌往后移动{arr[j+1] = arr[j]; // 把手里的牌往后移动一个j -= 1; // 把箭头后移}arr[j+1] = tem; // 为什么是j+1因为手里的牌是j 插入到后面是j+1}for(i=0;i<sz;i++){printf("%d ",arr[i]);}
}

快速排序

原理:先随机找出一个数,然后从数组右边往左边开始找,找比这个数小的放到这个数左边,然后从数组0个位置开始找比这个数大的放到数组右边,然后把这个数进行归位,然后依次把左半区和有伴区采用这中方法进行递归

int partition(int li[],int left,int right)
{int temp = li[left]; // 把第一个数存起来while (left<right){while (left<right && li[right]>=temp) // 从右面找比temp小的数(右边的数比我的数大就进入循环,循环停止说明找到比他小的数,或者right<left了)right -= 1; // 往左走一步li[left] = li[right]; // 把找到比temp小的数,放到起始位置,也就是小的数在左边while (left<right && li[left]<=temp) // 从左边开始找比temp大的数(当左边的数大于temp就进入,循环停止说明已经找到小的数)left += 1; // 往后走一步li[right] = li[left]; // 把找到比temp大的数放到right的位置,刚才空出来的地方}li[left] = temp; // 把temp归位,最后一次执行left,和right 的位置会重叠return left; // 返回归为的下标
}void quick_sort(int arr[],int left,int right)
{   // o(nlongn) 一层的复杂度是logn 有n层// 快排原理:先随机找一个数(一般是第一个数),// 然后进行归位成,左边都是把他小的数,右边都是比他大的数// 然后就形成了两个版区,再利用递归,到左半区,先找一个数,进行归位,也就是左边是比他小右边比他大if(left<right){int mid = partition(arr,left,right); // 找出中间数的下标quick_sort(arr,left,mid-1); // 左半区进行递归quick_sort(arr,mid+1,right); // 有半区进行递归}}

堆排序

  • 大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大
  • 堆的向下调整:节点的左右子树都是堆但自身不是堆,可以通过一次向下
    调整来将其变换成一个堆。
    1,建立堆:先从最后一个叶子节点开始构造,从最后一个往上构造
    2,得到堆顶元素,为最大元素
    3,去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序
    4,堆顶元素为第二大元素
    5,重复步骤3,直到堆变空
void sift(int li[],int low,int high)
{// li:列表// low:堆的根节点位置// high:堆的最后一个元素的位置// 向下调整int i = low; // i最开始指向的根节点int j = 2*i+1; // j左孩子元素int tmp = li[low]; // 把堆顶元素存起来,也就是第一个元素while (j<=high) // 要保证j位置有数{if (j+1<=high && li[j+1]>li[j]) // 保证右孩子有数,如果右孩子比左孩子大{j = j+1; // j 指向右孩子}if (li[j]>tmp) // 堆顶的数和下面大的数进行比较{li[i] = li[j]; // i指向的是堆顶,那下面大的提上来i = j; // i往下走j = 2*i+1;}elsebreak;}li[i] = tmp; // 放到叶子节点上面
}void heap_sort(int li[],int sz)
{int n = sz,i,j;for(i=(n-2)/2;i>=0;i--) // 从最后一个元素的父节点开始建堆{// i表示建堆的时候调整的部分跟下标sift(li,i,n-1);}for(j=n-1;j>=0;j--){ // j 指向当前堆的最后一个元素// 依次把最后一个元素放到堆顶,并把j的位置向前移动一个,进行向下调整,每次堆顶都是最大数// 然后把堆顶的数和要上去的数交换位置,就会形成一个升序的完全二叉树int t = li[0];li[0] = li[j];li[j] = t;sift(li,0,j-1); // i-1是新的high}}

使用堆排序解决topk问题

问题:假如有组数,要找出前k个最大的数
第一步,建立一个k长度小根堆,然后把k到数组结尾的数依次和小根堆进行比较,要是比他大就和堆顶数进行交换,然后进行向下调整,最后的得到一个前k大小的小根堆,然后进行向下调整就得到了一个排好序的数

void sift1(int li[],int low,int high)
{int i = low; // 顶部数据int j = 2*i+1; // 子节点int tmp = li[low];while (j<=high) // 保证j有数据,不能超过最后一个{if(j+1<=high && li[j+1]<li[j]) // 右孩子不能越界,如果右孩子大于左孩子{j = j+1; // j指向右孩子}if(li[j]<tmp){li[i] = li[j];i = j;j = 2*i+1; // 往下走}elsebreak;}li[i] = tmp; // 放到最后的叶子节点,或者是因为i已经是最小直接放到堆顶
}void topk(int li[],int sz,int k)
{int i,j,z,arr[k];for(z=0;z<k;z++){   // 构造一个列表,取出前k个数放到这个列表里面arr[z] = li[z];}for(i=(k-2)/2;i>=0;i--){   // 使用这个列表构成一个小根堆sift1(arr,i,k-1);}for(j=k;j<sz;j++){   // 遍历列表每次进来一个数和堆顶相比较,要是比他小就不进来,要是比他大就进去然后调整 堆if(li[j]>arr[0]){arr[0] = li[j];sift1(arr,0,k-1);}}for(j=k-1;j>=0;j--){// i 指向当前堆的最后一个元素int t = arr[0];arr[0] = arr[j];arr[j] = t;sift1(arr,0,j-1); // i-1是新的high}for(j=0;j<k;j++){printf("%d ",arr[j]);}
}

C语言lowB排序和NB排序相关推荐

  1. c语言排序需要插空的最小次数,C语言数组排序——冒泡排序、选择排序、插入排序...

    一.冒泡排序 原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置. 然后比较第二.第三个--直到比较第n-1个和第n个,此时,每一次比较都 ...

  2. R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet、面图)实战

    R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet.面图)实战 目录

  3. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  4. R语言可视化包ggplot2绘制排序条形图实战:按照分类因子排序、按照数值排序

    R语言可视化包ggplot2绘制排序条形图实战:按照分类因子排序.按照数值排序 目录

  5. 数据结构源码笔记(C语言):直接选择排序

    //实现直接选择排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

  6. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  7. 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)

    成绩排序系统(练习排序算法和复习C语言) 实验一 一.实验目的 1.回顾C语言中的输入.输出及结构体等相关知识点: 2.回顾函数的使用: 3.掌握插入排序.交换排序.选择排序中的常用排序的算法思想: ...

  8. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  9. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

    参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...

  10. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

最新文章

  1. VC回调函数定义和使用
  2. 【Linux】【Basis】文件系统
  3. [Machine Learning] logistic函数和softmax函数
  4. java sql string_JAVA String转化成java.sql.date和java.sql.time方法示例
  5. Python装饰器学习笔记 1
  6. u3d 逐个点运动,路径运动。 U3d one by one, path motion.
  7. 深度学习工具caffe详细安装指南
  8. 去除List集合中的重复值(四种好用的方法)
  9. Winform使用DevExpress的WaitDialogForm画面 z
  10. 快速行进算法(fast_marching_kroon)的matlab代码
  11. 中移4G模块-ML302-OpenCpu开发-ADC
  12. 机器学习--支持向量机(六)径向基核函数(RBF)详解
  13. Android 高德地图 Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance:(Ljava/lan
  14. 人体的神经系统图 分布,人神经系统分布图高清
  15. Android Intent详解
  16. Prisma 与瘦后端
  17. 关于举办“COMSOL Multiphysics多物理场仿真技术与应用”光电专题线上培训班的通知
  18. gzip and deflate
  19. 华为云服务器使用之搭建极简服务器
  20. sap成本流怎么看_[原创]SAP方丈-写给新手的SAP成本核算流程

热门文章

  1. 计算机领域的世界之最,超级计算机神威·太湖之光世界最快(中国这五年的世界之最④)...
  2. 制作血条/蓝条/蓄力条等进度条(Progress Bar)
  3. Python基础学习笔记-4.组合数据类型
  4. Ubuntu安装应用商店中没有的软件
  5. 用计算机探索商的变化规律教案,用计算器探索规律教学设计与反思(精选5篇)...
  6. 《Real-Time Rendering 4th Edition》全文翻译 - 第7章 阴影(下)7.7 ~ 7.10
  7. 618“低调”谢幕,百秋尚美如何携手品牌跨越“不确定时代”?
  8. 基于jsp+java+ssm的大学生缴费系统
  9. 这是转载的孔雀东南飞的文章
  10. MIPI接口资料汇总(精)