C数据结构之排序

数据结构(C语言版) 快速排序 快速排序: 代码实现: 说明:本博客的代码实现贴近数据结构(C语言版) 课本代码风格,使用抽象数据类型。 项目结构 以下文件代码与直接插人排序时所用相同,为避免大量代码重复此处不再附上。 详情可参考直接插人排序:https://blog.youkuaiyun.com/ZipayYu/article/details/98245056 status.h ststus.cpp SequenceListType.h... 阅读详情
选择排序
===============================================
void  SelectSort(RecordType r[], int length)
{ n=length;
   for ( i=1 ; i<= n-1; ++i)  
     { k=i;
       for ( j=i+1 ; j<= n ; ++j)  
          if (r[j].key < r[k].key )  k=j;
          if ( k!=i) /*如果k在循环中改变了,就需要交换数据*/
              { x= r[i]; r[i]= r[k]; r[k]=x; }
       }
   }
================================================
 直接插入排序
================================================
void insert_sort(int *r, int n)
{
    int i, j, t;
    for (i=2; i<=n; i++) {
        r[0]=r[i];  j=i-1;
        While(r[0]<r[j]){
         r[j+1]=r[j];  j=j-1;
       }
  r[j+1]=r[0];
  }
}
================================================
 冒泡排序
=================================================
void bubble_sort(recordtype r[ ], int n); 
{  i= n;
   while ( i >1)
      {  laste=1;
         for  (j=1; j<i; j++)
           if (r[j+1].key < r[j].key) 
              {  x=r[j]; r[j]=r[j+1]; r[j+1]=x;
                laste= j;  {记下进行交换的记录位置}
               }  
        i= laste; {本趟最后一次进行交换的记录位置} 
       }
}
================================================
 希尔排序
=====================================================
Void shellinsert(recordtype r[ ], int length, int d )
 { 
     for(i=1+d; i<=length; i++) 
      if(r[i].key < r[i-d].key) 
        {  r[0]=r[i];       /*备份r[i]*/
           for(j=i-d;j>0&&r[0].key< r[j].key;j-=d) //查找r[i]的插入位置
                 r[j+d]=r[j]; //后移记录
           r[j+d]=r[0];}/*插入r[i]到正确的位置上*/
        }      
Void shellsord(recordtype r[ ], int length, int d[], int n) 
{ 
     for (i=0;i<=n-1,++i)
     shellinsert(r,length, d[i] );
}    
================================================
 快速排序
=====================================================
int QKpass(recordtype r[ ], int s, int t)/*本算法对r[s..t]进行一趟快速排序*/
 {  x=r[s]; i=s; j=t;   
    while  (i<j)            /*low用i表示, high用j表示*/
      { while (i<j)&&(r[j].key>=x.key)  j=j-1;   
         r[i]=r[j];     
        while (i<j)&&(r[i].key<=x.key)  i=i+1;   
         r[j]=r[i];    
      }
     r[i]=x;   
	 return i;  
 }       
void QKsort(recordtype r[ ], int low, int high); /*对记录序列r[low.. high]进行快速排序*/
{   if  (low < high){ 
		pos=QKpass(r,low,high);/*对 r[low.. high] 进行一趟划分,pos为枢轴*/
		QKsort(r,low,pos-1);   /*对低子序列递归排序*/
		QKsort(r,pos+1,high); /*对高子序列递归排序*/
		} 
}
================================================
 堆排序
void   crt_heap(RecordType r[], int length ) /*对记录数组r建堆,length为数组的长度*/
{   n= length;
    for ( i=n/2 ; i>= 1 ; --i)
        sift(r,i,n) ;
 } 
void  HeapSort(RecordType  r[],int length)   /* 对r[1..n]进行堆排序*/ 
{   crt_heap(r, length); 
    n= length;
   for (  i=n  ; i>= 2 ; --i) 
     { b=r[1]; r[1]= r[i]; r[i]=b; /* 将堆顶记录和堆中最后一个记录互换 */ 
       sift(r,1,i-1);  /* 进行筛选,使r[1..i-1]成为堆 */ 
     }  
}
================================================
归并排序
void Merge ( RecordType r1[],  int low,   int mid,   int high,  RecordType  r[])
/*r1[low..mid]和r1[mid+1..high]分别有序,将它们合并*/
{   i=low;j=mid+1; k=low;
    while ( (i<=mid)&&(j<=high)  )  
     {
	 if ( r1[i].key<=r1[j].key ){
		  r[k]=r1[i] ; ++i;
		  }
      else 	
          { 
		  r[k]=r1[j] ; ++j;
		  }
           ++k ;   
    }
  while ( i<=mid )   r[k} =r1[i];k++;i++;
  while ( j<=high  ) r[k} =r1[j];k++;j++;
 }
void   MergeSort (RecordType  r1[],  int  low,  int  high,  RecordType  r[])
 /*r1[low..high]经排序后放在r[low..high]中,r2[low..high]为辅助空间 */ 
{   RecordType  r2 [hight-low+1] ;
   if ( low==high ) 
        r[low]=r1[low];
   else{mid=(low+high)/2;
         MergeSort(r1,low, mid,  r2);
         MergeSort(r1,mid+1,high,  r2);
         Merge (r2,low,mid,high, r);}
   }


排序方法

平均时间

最坏时间

辅助空间

  稳定性

简单排序

    O(n2)

   O(n2)

    O(1)

   稳定

希尔排序

   O(n3/2)

  O(d[k])

  非稳定

快速排序

 O(nlogn)

   O(n2)

  O(logn)

  非稳定

  堆排序

 O(nlogn)

 O(nlogn)

    O(1)

  非稳定

归并排序

 O(nlogn)

 O(nlogn)

    O(n)

   稳定

基数排序

  O(d*n)

  O(d*n)

    O(rd)

   稳定


数据结构(c语言)常用的排序方法 直接选择排序的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,…快速排序的基本思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。熟练掌握常用的内排序方法并加以比较。 阅读详情

相关推荐

数据结构(C语言版) 折半插入排序

折半插入排序示例: 此处以数据2的排序为例,用i从左到右遍历到下标为5的位置,发现此处的值2小于前一位的值5 下标 0 1 2 3 4 5 6 数据 1 3 4 5 2 6 遍历位置 i 将2放到缓存0的位置,下限low从下标1开始,上限high从下标i-1开始 计算折半位置为m = (low + high) / 2=2 下标 0 1 2 3 4 5 ...

ZipayYu的博客 2238

排序算法之堆排序(Heap Sort)——C语言实现

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。 算法分析 在学习堆排序之前我们要先了解堆这种数据结构。 堆的定义如下:n个元素的序列{k1,k2,···,kn}当且满足以下关系时,称之为堆。       若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶子结...

zihonggege的博客 5万+

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 520

【图解数据结构】排序全面总结(二)

一、前言 二、选择类排序 选择类:每次从待排序的无序序列中,选择一个最大或最小的数字,放到前面,数据元素为空时排序结束 1.简单选择排序 动态演示: 算法讲解: 首先通过n-1次比较,从n个记录中找出最小值,将它与第一个元素交换 再通过n-2次比较,从剩余的n-1个记录中找出次小的值,将它与第二个记录交换 重复上述操作n-1,排序完成 代码: void SelectSort(RecordType r[], int length) /*对记录数组r做简单选择排序,..

知心宝贝的博客 5485

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

从原理图到PCB:Cadence Allegro 17.4网表同步全流程详解(含第三方网表配置)

本文详细解析了Cadence Allegro 17.4中从Orcad原理图到PCB布局的网表同步全流程。核心内容包括标准的第一方网表同步步骤,以及针对第三方网表导入时关键的封装库路径配置方法,并提供了常见同步错误的排查思路,帮助工程师高效、准确地完成设计数据传递,确保PCB设计顺利开局。

salt9的博客 654

排序方法汇总

/*  Date: 11-02-10 17:40  Description: 排序方法 */#include #include #define TRUE 1#define FALSE 0typedef int KeyType;typedef int OtherType;typedef struct{ KeyType key; OtherType other_data;}RecordType;void  InsSort(RecordType  r[],  int length);void  BinSort (

strivingboy专栏 639

保姆级教程:在阿里云ECS上用Docker一键部署EMQX MQTT服务器(Ubuntu 20.04)

本文提供在阿里云ECS上使用Docker一键部署EMQX MQTT服务器的详细教程,涵盖从实例创建、Docker环境配置到EMQX部署与优化的全流程。适合物联网开发者快速搭建高效、安全的MQTT消息服务器,适用于智能家居、工业物联网等场景。

weixin_28739079的博客 308

堆序排序

堆序排序: 注:代码在最后 1、将原始数据构成完全二叉树 如67、65、77、38、97、3、33的数组 2、对最后一个非叶节点4筛运算 (非叶节点:后面没有子节点,图中1、2、3、4为非叶节点) 3、对倒数第二个非叶节点3筛运算、对倒数第三个非叶节点2筛运算……直至根节点 至此,堆结构构造完成。 堆序输出 1、根据堆结构的特点,根节点最大,我们从小到大排序,因此将根节点放到数组最后,也就是...

qq_43566496的博客 325

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2424

三种1:4传输线变压器巴伦的分析

满足多模多馈天线系统匹配要求的传输线变压器巴仑有:双线传输线变压器( 见图1) 、三线传输线变压器( 见图4) 和四线传输线变压器( 见图5) 。尽管3 者的结构不同, 但都可实现1∶4 阻抗变换和不平衡-平衡转换。下面就应用电报方程对它们的阻抗变换特性和输出平衡特性进行分析。

weixin_42407808的博客 8047

C语言_数据结构:随机10000个数字,进行所学的各种排序(八大排序)

C语言_数据结构:随机10000个数字,进行所学的8(9)大排序 题目: 由计算机生成10000个整数,使用所学几种排序算法进行排序,统计排序所用的时间,分析各种排序的性能。 创建数组 //创建数组 int *CreatArray() { int *arr = (int*)malloc(sizeof(int)*MAX); srand((unsigned int)time(NULL)); for (int i = 0; i < MAX; i++) { int randNum = ran

qq_39112175的博客 1万+

Laser-Marking 激光振镜打标机的开源代码 - 下载 - 搜珍网

为了方便开发者的使用和定制化需求,我们在这里提供激光振镜打标机的开源代码,并附带详细的描述。首先,让我们来了解一下激光振镜打标机的基本原理。振镜系统由两个可移动的反射镜组成,可以控制激光束在水平和垂直方向上的偏转角度,从而实现对工件的精确控制。通过这段开源代码,开发者可以根据自己的需求对激光振镜打标机进行二次开发和定制化。你可以修改振镜角度、打标速度等参数,也可以添加其他功能,例如自动识别和追踪等。首先,我们创建了一个串口对象,用于与激光振镜打标机进行通信。函数实现了对用户输入文本的打标操作。

TechProX的博客 1278

数据结构c语言版 内部选择排序编程,数据结构C语言版_选择排序

数据结构C语言版_选择排序/*数据结构C语言版 选择排序P277-P282编译环境:VC++6.0日期:2011年2月16日*/#include #include #include #include // 记录类型typedef struct{int key;// 关键字项int otherinfo;// 其它数据项}RedType;#define MAXSIZE 30// 一个用作示例的小顺序表...

weixin_31438219的博客 223

基于YOLOv11的军事目标识别系统设计与实现(坦克、舰船检测)

DOTA-v2.0(包含多种军事装备的航拍图像)图片数量:11,268类别:18类,包括坦克、舰船、战斗机等分辨率:800×800~4000×4000HRSC2016(高分辨率舰船检测数据集)图片数量:1,061类别:舰船及子类特点:包含多种视角和复杂背景图片数量:5,000+类别:22种军用飞机标注:精确边界框自建数据集建议收集来源:公开军事演习视频、卫星图像、模拟游戏截图数据增强:模拟不同天气、遮挡、低光照等战场环境。

YOLO 450

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言_数据结构_排序

本章重点讲解了排序八大算法,深入排序的学习,不断提高排序上的效率以及各种各样对数据排序的方法。

m0_74445256的博客 868

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【数据结构】【c】【算法】冒泡排序,简单选择排序,插入排序的实现

//编写人:naruuu //编写功能:排序算法的实现 //编写时间:12 11 #include <stdio.h> #include <iostream> #include <bits/stdc++.h> using namespace std; #define N 1000 int arr[N]; /* 对长度为n的数组arr执行冒泡、插入、选择排序 */ void bubbleSort(int arr[], int n); void insertionSor

nruuu的博客 268

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构的C语言实现-线性表的合并与排序

一、线性表简介: 1、线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列 2、线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点) 二、线性表的一般操作: (1) InitList(& L)

DavidGarrett的博客 4708

【C语言简单实现数据结构】排序之插入排序和选择排序

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序...

m0_62824408的博客 409

数据结构C代码汇总【7-排序】

第七章 排序

preserver的博客 333

数据结构排序方法总结(C语言)

数据结构排序方法总结(C语言) #include <iostream> using namespace std; #define MAXSIZE 100 typedef int KeyType; //关键字的类型 typedef struct { KeyType key; //关键字像 /*可能有其他数据项,比如一个学生,有name,id,score,则key可能是其中的一个*/ } RcdType; typedef struct List *SqList; // struct List

WHY的博客 660

c数据结构--排序

本来最坏应该是N^2,但是经过前面预排序,数组已经很接近有序了,所以按最好情况算,这里也为N。begin2,end1,end2都有可能越界,begin1不可能越界,因为它=i,i<n。1、cur找到比key小的值,++prev,cur和prev位置的值交换,++cur。prev为界限,prev左边及其本身是比key小的,prev右边是比key大的。//修正路线--如果不全部替换,将会导致tmp中未知数替换到a数组中。////1.gap最后会除到1,1的时候就是直接插入排序。

2301_81568645的博客 411

【PTA数据结构 | C语言版】排序

给定 n 个(长整型范围内的)整数,要求输出从小到大排序后的结果。输入格式:输入第一行给出正整数 n(≤10^5),随后一行给出 n 个(长整型范围内的)整数,其间以空格分隔。输出格式:在一行中输出从小到大排序后的结果,数字间以 1 个空格分隔,行末不得有多余空格。

等风来 4496

数据结构:排序详解(使用语言:C语言)

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

hy____123的博客 2万+

c语言数据结构之排序

c语言数据结构之排序

qq_55918164的博客 577
上一篇: C语言指针和数组
下一篇: 现代通信网基础
macandroid
博客等级 码龄14年 35粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值