-
多关键字排序(C语言)
2011-03-17 12:12:48利用多关键字排序进行高考分数处理,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。 假设待排序的记录数不超过1000,表中... -
C语言关键字浅析-int
2018-11-19 08:42:04int不仅是很多main函数的类型,还陪伴了我们学习打印输出、加减乘除求模、排序、查找…… int的作用是: 定义或声明整数类型。 1、int的存储 通常int类型的数据在内存中用一个字来存储,比如...### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
int,几乎是大部分学习C的人最早认识的一个关键字,似乎也是各种源代码中最常见的关键字之一
int不仅是很多main函数的类型,还陪伴了我们学习打印输出、加减乘除求模、排序、查找……
int的作用是:
定义或声明整数类型。
1、int的存储
通常int类型的数据在内存中用一个字来存储,比如旧时的IBM PC兼容机里面,int用16位来存储(能表示的区间-32768~32767)
现在的计算机一般用32位来存储一个int类型数据,从计算机的发展趋势上看,未来int仍然可能会进化为用64位存储
不过ISO/ANSI C里面还是规定了,int类型的最小取值范围应该是-32768~32767
同时需要注意的是,int类型的整数是有符号整数,所以int在内存中的一个字中有一位是符号位
虽然我们看到的打印出来的int数据是128、345、1949这样的十进制数据,但计算机是二进制的,在内存内部其实是按二进制存储的
如果你了解进制转换就应该清楚,把十进制转为二进制才能方便计算机存储:
2、int的使用
声明一个int变量是最基本的,当然基本是学习C中最简单的语法:
int n; /* 定义一个整型变量n,未初始化 */ n = 2; /* 将n赋值 */ int m = 1; /* 定义一个整型变量m,初始化为1 */ int max, min; /* 一句中定义两个变量max和min,均未初始化 */ int temp = 25, humi = 45; /* 一句定义两个变量temp和humi,均初始化 */ int width, height = 100; /* 一句定义两个变量width和height,其中height赋值为100, 这种编程风格不提倡,容易引起两个变量都是100的错觉 */
如果你了解C语言的5个存储类,你就会知道上述的变量n是一个自动变量,定义后并没有初始化,所以没有值,但为其分配了内存空间
同样是自动变量的m,在定义时也初始化了,所以为其分配空间时也把值赋了进去
上述代码中还有1,2,25,45等这样的整数字样,其实在C语言中这些明写的数字叫做整数常量
如果一个整数常量的值在int能表示的范围内,C将会把它当做int类型看待,也叫做int常量
类似地,如果整数常量的值大于了int表示范围,C还有其他有更大表示范围的整数类型去看待(比如long)
不过如果你写成了1.0或者25.0,C就不会将其看做整数常量了(后面会讲到C默认把这样的数字看做double双精度浮点数类型)
3、int的输入输出
在C中,我们常使用scanf和printf来对数据进行输入和输出
对于int类型的数据,我们还有说明符%d辅助进行输入输出:
int n; scanf("%d", &n); /* int的说明符是%d,用scanf输入int数据的值的时候别忘了加&,表示地址引用 */ printf("n = %d", n); /* int的输出也是使用%d,但后面无需再加&取地址符,注意这与scanf的区别 */
需要注意的是,%d只是最常见的对int数据进行十进制形式输出显示,如果需要八进制或者十进制输出,可以使用%o和%x:
int N = 100; printf("%d, %o, %x\n", N, N, N); /* 输出为100,144,64 */ printf("%d, %#o, %#x", N, N, N); /* 输出为100,0144,0x64,#号是为了更直观地表示数的进制 */
——参考《C Primer Plus第五版》
相关文章:
-
使用策略模式(strategy pattern)实现多关键字排序(1)
2012-02-27 11:20:06C语言中函数指针的主要用途是实现Strategy(策略)模式。为了在Java程序设计语言中实现这种模式,声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类。如果一个具体策略被使用一次,那么通常...C语言中函数指针的主要用途是实现Strategy(策略)模式。为了在Java程序设计语言中实现这种模式,声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类。如果一个具体策略被使用一次,那么通常使用匿名类来声明和实例化这个具体策略。如果一个具体策略需要被到处去以便重复使用,那么它的类通常是一个私有的静态成员类,并且通过一个公有静态final域被导出,其类型为该策略接口。
-
lfu算法实现c语言_冒泡排序算法(起泡排序)及其C语言实现
2021-01-04 21:10:55冒泡排序起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。更多学习资料Q群:569268376例如,对无序表{49,38,65,97,76,13,27,49}进行...冒泡排序
起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。
更多学习资料Q群:569268376
例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示:
图 1 第一次起泡
如图 1 所示是对无序表的第一次起泡排序,最终将无序表中的最大值 97 找到并存储在表的最后一个位置。具体实现过程为:
- 首先 49 和 38 比较,由于 38<49,所以两者交换位置,即从(1)到(2)的转变;
- 然后继续下标为 1 的同下标为 2 的进行比较,由于 49<65,所以不移动位置,(3)中 65 同 97 比较得知,两者也不需要移动位置;
- 直至(4),97 同 76 进行比较,76<97,两者交换位置,如(5)所示;
- 同样 97>13(5)、97>27(6)、97>49(7),所以经过一次冒泡排序,最终在无序表中找到一个最大值 97,第一次冒泡结束;
由于 97 已经判断为最大值,所以第二次冒泡排序时就需要找出除 97 之外的无序表中的最大值,比较过程和第一次完全相同。
经过第二次冒泡,最终找到了除 97 之外的又一个最大值 76,比较过程完全一样,这里不再描述。
通过一趟趟的比较,一个个的“最大值”被找到并移动到相应位置,直到检测到表中数据已经有序,或者比较次数等同于表中含有记录的个数,排序结束,这就是起泡排序。
完整代码
#include //交换 a 和 b 的位置的函数void swap(int *a, int *b);int main(){ int array[8] = {49,38,65,97,76,13,27,49}; int i, j; int key; //有多少记录,就需要多少次冒泡,当比较过程,所有记录都按照升序排列时,排序结束 for (i = 0; i < 8; i++){ key=0;//每次开始冒泡前,初始化 key 值为 0 //每次起泡从下标为 0 开始,到 8-i 结束 for (j = 0; j+1<8-i; j++){ if (array[j] > array[j+1]){ key=1; swap(&array[j], &array[j+1]); } } //如果 key 值为 0,表明表中记录排序完成 if (key==0) { break; } } for (i = 0; i < 8; i++){ printf("%d
-
C语言 快速排序
2020-07-20 14:26:23快速排序通过分而治之的策略,交换两个不相邻的元素,一次可以消去多个逆序,效率极高。 基本思想 在待排序的序列L[1~n]中,任意取一个元素pivot作为“枢轴”,凡是关键字小于枢轴的记录,均移动到该记录之前,...快速排序
快速排序是交换排序的一种,通过分而治之的策略,交换两个不相邻的元素,一次可以消去多个逆序,效率极高。
- 基本思想
在待排序的序列L[1~n]中,任意取一个元素pivot作为“枢轴”,凡是关键字小于枢轴的记录,均移动到该记录之前,关键字大于枢轴的记录,均移动到该记录之后,即对无序的记录进行“以此划分”,之后分别对分割所得的两个子序列“递归”调用进行快排。
通过一趟排序将待排序序列划分为具有如下特点的两部分:
一次划分会将一个元素pivot防止在它最终的位置上。- 算法实现的思路
初始化标记low为划分部分第一个元素的位置,high为最后一个元素的位置,然后不断地移动两个标记并交换:
(1)high向前移动找到第一个比pivot小的元素
(2)low向后移动找到第一个比pivot大的元素
(3)交换当前两个位置的元素
(4)继续移动标记,执行1),2),3)的过程,直到low>=high为止。 - C语言代码
#include <stdio.h> int Partition(int A[],int low,int high); void QuickSort(int A[],int low,int high); int main() { int A[1024],n; printf("请输入要输入的元素个数:"); scanf("%d",&n); printf("\n请输入要排序的序列:\n"); for (int i=1; i<=n; i++) //输入的元素从1开始,0做哨兵 scanf("%d",&A[i]); printf("\n使用快速排序算法后的结果:\n"); QuickSort(A,1,n); for(int i=1; i<=n; i++) printf("%d\t",A[i]); printf("\n"); return 0; } int Partition(int A[],int low,int high){ int pivot=A[low];//pivot枢点 while(low<high){ while(low<high&&A[high]>=pivot) high--; A[low]=A[high]; while(low<high&&A[low]<=pivot) low++; A[high]=A[low]; }A[low]=pivot; return low; } void QuickSort(int A[],int low,int high){ if(low<high){ int pivotpos=Partition(A,low,high); QuickSort(A,low,pivotpos-1); QuickSort(A,pivotpos+1,high); } }
- 运行结果
- Notes
①平均时间复杂度O(nlog2n),平均空间复杂度O(log2n);最坏时间复杂度O(n^2),最坏空间复杂度O(n)
②快速排序是不稳定的排序算法
- 基本思想
-
C语言快速排序
2018-12-25 19:46:10快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的...快速排序的算法步骤:在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经... -
数据结构C语言版:链式基数排序(课本)
2020-10-06 11:33:08分配类排序不需要比较关键字的大小,它是根据关键字中各位的值,通过对待排序记录进行若干趟 “ 分配 ” 与 “ 收集” 来实现排序的,是一种借助于多关键字排序的思想对单关键字排序的方法。基数排序(Radix Sorting)... -
c语言sort_C语言必学的12个排序算法:基数排序(第11篇)
2020-11-29 05:45:37——陆游「冬夜读书示子聿」# 基本思想基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字... -
C语言必学的12个排序算法:基数排序
2021-04-07 00:12:06# 基本思想基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键... -
【数据结构】C语言实现排序算法------基数排序
2020-10-29 20:19:04基数排序:借助多关键字排序的思想对单逻辑关键字进行排序的方法。 算法实现的思想如图: 算法的实现: 先统计数字的位数,记为n 每次数组值除10^n得到的结果,就将该数值放在该结果上 对所有数据做同样的操作,... -
C语言各种排序算法
2017-07-16 10:20:03随着增量逐渐减少,每组包含的关键字越来越多,当增量减少至1时,整个文件恰被分为一组,算法终止。优点:直接插入排序的改进版。 (1)不需要大量的辅助空间;(2)时间复杂度与增量序列的选取有关,(希尔增量... -
排序C语言
2019-08-26 17:36:29假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是... -
C语言实现:快速排序、冒泡排序、选择排序比较
2019-01-25 18:05:01本篇文章对基础快速排序、冒泡...值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 2.具体实现:对于快速排序算法来讲,首先就是要选取关键字,在这... -
c语言排序算法_C语言必学的12个排序算法:计数排序(第9篇)
2020-11-29 07:33:55[C语言必学的12个排序算法:基础知识 (第0篇)]线性时间排序之前学习的快速排序、堆排序、归并排序都是一类基于比较的排序算法,需要通过比较关键字大小确定数据元素的位置。这类算法最优的时间复杂度只能到O(nlogn)... -
C语言堆排序的实现
2017-01-25 12:40:09堆排序是一种树形选择排序,在排序过程中,将数组a[]看成一棵完全二叉树,利用双亲节点和孩子节点之间的内在关系,在当前无序的序列中选择关键字最大(或最小)的排序。其空间复杂度为O(1),在最坏的情况下时间... -
C语言必学的12个排序算法:基数排序(第11篇)
2020-08-04 16:38:49基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字,可以按照十进制位划分多关键字(十... -
数据结构(C语言描述)—排序
2016-12-21 09:31:39在排序的过程中存在多个相同的关键字的纪录,若排序前关键字顺序和排序后关键字顺序一致,则称这种排序方法是稳定的,反之则不稳定。 3.内部排序分类:(1)插入类排序 :在一个已排序好纪录子集基础上,每一步... -
C语言-七大排序算法实现和原理简述
2019-04-30 16:24:18基本概念: 排序:把一堆记录,按照其中某个或某些关键字的大小,递增或...外部排序:数据元素太多了,不能同时放在内存中,根据排序要求不能在内存之间移动数据的排序。 排序算法一: 插入排序:(减治算法) ... -
排序【8】之基数排序的C语言实现
2018-01-20 15:10:01基数排序(Radix Sorting)是一种借助多关键字排序的思想对单逻辑关键字进行关系的方法。基数排序不需要进行记录关键字间的比较。 主要分为两个过程: (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中... -
C语言8大经典排序算法(详细测试核心代码)
2020-03-29 10:35:26排序算法的稳定性,若排序对象中存在多个关键字相同的记录,经过排序后,相同关键字的记录之间的相对次序保持不变,则该排序方法是稳定的,若次序发生变化(哪怕只有两条记录之间),则该排序方法是不稳定的;... -
C语言排序算法汇总
2011-01-13 00:09:14几种排序算法的比较和选择1. 选取排序方法需要考虑的因素:(1) 待排序的元素数目n;...由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。(2) 若文件的初始状... -
用C语言实现简单的基数排序
2020-01-17 16:25:55基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人... -
堆排序 C语言实现
2020-11-20 16:42:37(Heap Sort) 是一种树形选择排序,在排序过程中,将待排序的记录Data[1…n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩 子结点之间的内在关系,在当前无序的序列中选择关键字最大(或最小)的... -
基数排序 --c语言
2020-02-10 12:23:02基数排序是一种针对于有多个关键字的数据的排序算法,不需要两两数据进行排序。排序的思想: 1.按照位数将数据插入到相应队列; 2.按照队列的顺序依次将数据弹出。 算法的过程: 1.... -
数据结构C语言代码实战06-排序
2021-02-06 17:02:37稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 ... -
C语言必学的12个排序算法:计数排序(第9篇)
2020-08-03 15:46:24[C语言必学的12个排序算法:基础知识 (第0篇)] 线性时间排序 之前学习的快速排序、堆排序、归并排序都是一类基于比较的排序算法,需要通过比较关键字大小确定数据元素的位置。这类算法最优的时间复杂度只能到O... -
(C语言)实现主位优先的基数排序及基本原理(含测试用例)
2020-05-03 15:50:18本博文源于浙江大学《数据结构》,今天跟随姥姥学习基数排序,基数排序是一种在桶排序算法推广下的排序算法,可用在多关键字排序,其主要思想无非是这些: -
冒泡排序(c语言)
2021-01-11 20:37:58它的特点是每一趟排序能确定一个或多个关键字的最终位置。 2.冒泡排序原理介绍(假设按升序排序): 对于给定n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,... -
排序及几种常用的排序算法(C语言实现)
2019-09-14 23:58:51假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是...