返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构与算法之排序总结(一)
  • 884
分享到

C语言数据结构与算法之排序总结(一)

2024-04-02 19:04:59 884人浏览 八月长安
摘要

目录一、前言二、基本概念1.排序2.排序方法的稳定性3.内部和外部排序三、插入类排序1.直接插入排序2.折半插入排序3.希尔排序四、交换类排序1.冒泡排序2.快速排序五、总结比较一、

一、前言

学习目标:

排序和查找密不可分,将待处理的数据按关键值大小有序排列后,查找更加快速准确

理解各种排序算法的定义和特点,并能将代码灵活运用

掌握各种排序方法时间复杂度与空间复杂度

理解排序稳定和不稳定的概念                

重点和难点: 希尔、快速、堆、归并排序这几种快速排序

二、基本概念

1.排序

定义:将一个无序的数据元素任意序列,重新排列成有序的过程

代码:


typedef struct{  
       int key;   //假设关键字为int型
       OtherType  other_data;
} RecordType;

2.排序方法的稳定性

0 1 2 3 4 5 6 7 8 9
5 4 10 11 22 8 10 76 1 2

解读:如上个表格这样的一个无序数组,想要将它按照从小到大排序。上图下标2和6对应的数字都是10,排序后假如红色的10任然在黑色的10前面,那这种排序方法就是稳定的,否则排序方法不稳定。

3.内部和外部排序

  • 内部排序:整个排序过程在内存中
  • 外部排序:需要排序的数过大,需要借助外部设备

三、插入类排序

插入类:在一个有序序列插入一个新的记录,使之仍然有序

1.直接插入排序

动态演示:

算法讲解: 

  1. 上面的动态图可以很好的表达直接插入的过程,只是动态图有点长
  2. 首先将0作为监视哨,用一个指针从前往后找后面的数字比前面数字小的,找到了放到0
  3. 指针开始向前移动,如果指向的值比监视哨里的值大,数字向后移
  4. 如果指向的值比监视哨里的值小,那把监视哨里的值存入这个元素之后
  5. 以此类推

代码:


void InsSort(RecordType  r[],  int length)

{ 
	int i,j;
	for (i=2;  i<=length;  i++) 
	{
		r[0]=r[i];      
		j=i-1;	         
		while (r[0].key< r[j].key )     
		{
			r[j+1]= r[j]; 
			j=j-1;
		}
		r[j+1]=r[0];	
	}
}  

特点: 

稳定排序

时间复杂度O(n*n), 空间复杂度O(1)

2.折半插入排序

算法讲解:

  1. 动态图没找到,只能用上面这张图片了
  2. 折半插入和折半查找思想差不多,对于一个有序的数组,将一个数字插入之后任然有序
  3. k=要插入的值  low=1, high=length , mid=(low+high)+1   mid对应的值比k大, high=low-1,否则 low=mid+1,
  4. 当low >high ,low后面就是k插入的位置

代码:


void BinSort (RecordType  r[],  int length)

{
	int i,j;
    RecordType x;	
    int low,high,mid;
	for (i=2; i<=length ; ++i ) 
	{
		x= r[i];  low=1;  high=i-1;
		while (low<=high )                   
		{
			mid=(low+high) / 2;
			if ( x.key< r[mid].key) high=mid-1;
			else 	low=mid+1;
		}
		for ( j=i-1 ; j>= low; --j )   r[j+1]= r[j];     
		r[low]=x;    
	}
}

特点: 

稳定排序

时间复杂度O(n*n), 空间复杂度O(1)

3.希尔排序

动态演示:

算法讲解: 

  1. 对于希尔排序来说取增量 d (d一般为奇数,并且逐次递减)
  2. 上图第一次排序d等于5,将第一个作为起始点,下标+5取下一个值,一直到最后,将去到的值从小到达排序,然后将第二个作为起始点,3 4 5依次作为起始点排序
  3. 第二次是d等于3
  4. 第三次是d等于1

代码:


void  shellInsert(RecordType r[], int length,  int  delta)

{	int i,j;
	for(i=1+delta;i<= length; i++)     
		if(r[i].key < r[i-delta].key)
		{
			r[0]= r[i];          
			for(j=i-delta; j>0 &&r[0].key < r[j].key; j-=delta)
				r[j+delta]= r[j];
				r[j+delta]= r[0];
		}
}

特点:

不稳定排序方法

增量序列的d取值无除1之外的公因子,最后一个增量值必须为1

时间复杂度O(nlogn)  空间复杂度O(1)

四、交换类排序

1.冒泡排序

动态演示:

算法讲解: 

  1. 设立两个指针,i,j
  2. 每一次排序都会把最大的一个数放到后面,依次类推,假设执行2次以后,那么最后2个数就不需要比较了
  3. 执行n-1次排序,结果完成

代码:


void  BubbleSort(RecordType r[], int length )

{	int n,i,j; nt change; RecordType x; n=length;  change=TRUE;
		for ( i=1 ; i<= n-1 && change ;++i ) 
		{	change=FALSE;
				for ( j=1 ; j<= n-i ; ++j) 
					if (r[j].key > r[j+1].key )  
					{
						x= r[j];
						r[j]= r[j+1];
						r[j+1]= x;
						change=TRUE;
					} 
		}
} 
{
	int pos;
	if(low<high)
	{
		pos=QKPass(r, low, high);  
		QKSort(r, low, pos-1);     
		QKSort(r, pos+1, high); 
		
	}
}

2.非递归算法:


int QKPass(RecordType r[],int left,int right)

{ 
	RecordType x;	int low,high;
	x= r[left];              
	low=left;  	high=right;
	while ( low<high )
	{
		while (low< high && r[high].key>=x.key )   
			high--;
		if ( low <high ) {r[low]= r[high];  low++;}  
		while (low<high && r[low].key<x.key  )   
			low++; 
		if (  low<high  ){ r[high]= r[low]; high--; } 
	}
	r[low]=x;                     
	return low;                     
}  

特点:

不稳定排序,但内部排序中公认效率最好的一种

时间复杂度O(nlogn)  空间复杂度O(logn)

五、总结比较

以上就是C语言数据结构与算法之排序总结(一)的详细内容,更多关于C语言 数据结构 排序的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构与算法之排序总结(一)

本文链接: https://lsjlt.com/news/160188.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言数据结构与算法之排序总结(一)
    目录一、前言二、基本概念1.排序2.排序方法的稳定性3.内部和外部排序三、插入类排序1.直接插入排序2.折半插入排序3.希尔排序四、交换类排序1.冒泡排序2.快速排序五、总结比较一、...
    99+
    2024-04-02
  • C语言数据结构与算法之排序总结(二)
    目录一、前言二、选择类排序1.简单选择排序2.树形选择排序3.堆选择排序三、归并排序四、分配类排序1.多关键字排序2.链式基数排序五、总结归纳一、前言 之前的排序总结(一)对插入类和...
    99+
    2024-04-02
  • 如何进行C语言数据结构与算法中的排序总结
    这篇文章将为大家详细讲解有关如何进行C语言数据结构与算法中的排序总结,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言学习目标:排序和查找密不可分,将待处理的数据按关键值大小有序排列后,...
    99+
    2023-06-22
  • C语言数据结构与算法之链表(一)
    目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的...
    99+
    2024-04-02
  • C语言数据结构之堆排序的优化算法
    目录1.堆排序优化算法1.1建堆的时间复杂度1.1.1 向下调整建堆:O(N)1.1.2 向上调整建堆:O(N*logN)1.2堆排序的复杂度1.2.1原堆排序的时间复杂度...
    99+
    2024-04-02
  • C语言数据结构中堆排序的分析总结
    目录一、本章重点 二、堆2.1堆的介绍(三点)2.2向上调整2.3向下调整2.4建堆(两种方式)三、堆排序一、本章重点  堆向上调整向下调整堆排序 二、堆 2.1...
    99+
    2024-04-02
  • C语言数据结构与算法排序的方法有哪些
    这篇文章主要介绍“C语言数据结构与算法排序的方法有哪些”,在日常操作中,相信很多人在C语言数据结构与算法排序的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法排序的方法有哪些”的疑...
    99+
    2023-06-22
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2024-04-02
  • 数据结构与算法之手撕排序算法
    目录前言为什么要学习排序算法?一.排序的概念及其应用1.1排序的概念1.2排序运用1.3 常见的排序算法二.排序算法分类1.插入排序1.1基本思想:1.2直接插入排序:1.3 希尔排...
    99+
    2023-05-16
    Java数据结构与算法 Java排序算法 数据结构与算法 排序算法
  • C语言数据结构之堆排序详解
    目录1.堆的概念及结构2.堆的实现2.1 堆的向下调整算法2.2 堆的向上调整算法2.3 建堆(数组)2.4 堆排序2.5 堆排序的时间复杂度1.堆的概念及结构 如果有一个关键码的集...
    99+
    2024-04-02
  • C语言数据结构与算法之单链表
    目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
    99+
    2024-04-02
  • C语言数据结构与算法之链表(二)
    目录引入模拟链表介绍插入代码实现代码实现  引入 在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,...
    99+
    2024-04-02
  • C语言数据结构经典10大排序算法刨析
    1、冒泡排序 // 冒泡排序 #include <stdlib.h> #include <stdio.h> // 采用两层循环实现的方法。 // 参数a...
    99+
    2024-04-02
  • C语言植物大战数据结构希尔排序算法
    目录前言一、插入排序1.排序思路2.单趟排序详细图解3.整体代码4.时间复杂度(1).最坏情况下(2).最好情况下(3).基本有序情况下(重点)5.算法特点二、希尔排序1.希尔从哪个...
    99+
    2024-04-02
  • 【数据结构与算法】堆与堆排序
    目录 一.堆的实现1.堆的概念2.堆的代码实现二.堆排序的讲解 一.堆的实现 1.堆的概念 堆是一种数据结构,首先它总是一颗完全二叉树(因为堆适合表示完全二叉树),在逻辑上堆是一颗...
    99+
    2023-09-04
    php 开发语言 原力计划
  • C语言数据结构与算法中枚举、模拟及排序的方法
    本篇内容主要讲解“C语言数据结构与算法中枚举、模拟及排序的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言数据结构与算法中枚举、模拟及排序的方法”吧!枚举连号区间数来源:第四届蓝桥杯省赛...
    99+
    2023-06-30
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2024-04-02
  • C语言数据结构与算法之字符串详解
    目录串的定义串的比较 串的抽象数据类型串的初始化相关定义初始化定长类初始化串的堆式顺序存储结构(Heap)初始化堆字符串 赋值操作比较两个堆字符串的大小 串的定义...
    99+
    2024-04-02
  • Java数据结构与算法系列精讲之排序算法
    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 冒泡排序 冒泡排序 (Bubble Sort) 是一种简单的排序算法. 它重复地遍历要排序的...
    99+
    2024-04-02
  • java数据结构与算法之快速排序详解
    本文实例讲述了java数据结构与算法之快速排序。分享给大家供大家参考,具体如下:交换类排序的另一个方法,即快速排序。快速排序:改变了冒泡排序中一次交换仅能消除一个逆序的局限性,是冒泡排序的一种改进;实现了一次交换可消除多个逆序。通过一趟排序...
    99+
    2023-05-31
    java 数据结构 算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作