c语言优先级排序表
发布时间:2025-05-13 20:33:26 发布人:远客网络
一、c语言优先级排序表
1、c语言优先级排序表:括号、递增/递减运算符、正负号运算符以及取地址运算符。
2、C语言是一种重要的编程语言,其各种运算符的优先级非常重要。首先就是最高优先级的运算符,这些运算符的优先级排在最前面,优先级最高,如果在程序中出现了这些运算符,那么它们会首先被执行。接下来是乘法、除法和求模运算符,它们的优先级相同,排在第二位。当程序中出现多个这类运算符时,它们的优先级是一样的,根据左到右的顺序依次执行。
3、第三位是加法和减法运算符,它们的优先级相同,但是比乘除法和求模运算符要低。如果程序中同时出现了乘除法和加减法的运算符,那么乘除法会先被执行。最后是逻辑运算符,包括了与、或、异或运算符。这些运算符的优先级比较低,如果在程序中出现多个逻辑运算符时,根据左到右的顺序依次执行。
4、C语言包含的各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。
5、C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、switch语句等。可以用于实现函数的逻辑控制,方便面向过程的程序设计。C语言包含34个运算符,将赋值、括号等均视作运算符来操作,使C程序的表达式类型和运算符类型均非常丰富。
二、C语言排序
//总共给你整理了7种排序算法:希尔排序,链式基数排序,归并排序
//起泡排序,简单选择排序,树形选择排序,堆排序,先自己看看吧,
//看不懂可以再问身边的人或者查资料,既然可以上网,我相信你所在的地方信息流通方式应该还行,所有的程序全部在VC++6.0下编译通过
typedef int InfoType;//定义其它数据项的类型
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
InfoType otherinfo;//其它数据项,具体类型在主程中定义
RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元
void ShellInsert(SqList&L,int dk)
{//对顺序表L作一趟希尔插入排序。本算法是和一趟直接插入排序相比,
// 1.前后记录位置的增量是dk,而不是1;
// 2.r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。算法10.4
for(i=dk+1;i<=L.length;++i)
if LT(L.r[i].key,L.r[i-dk].key)
for(j=i-dk;j>0&<(L.r[0].key,L.r[j].key);j-=dk)
L.r[j+dk]=L.r[j];//记录后移,查找插入位置
printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo);
void ShellSort(SqList&L,int dlta[],int t)
{//按增量序列dlta[0..t-1]对顺序表L作希尔排序。算法10.5
ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序
printf("第%d趟排序结果:",k+1);
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8},{55,9},{4,10}};
int dt[T]={5,3,1};//增量序列数组
/*****************************************************************/
typedef int InfoType;//定义其它数据项的类型
typedef int KeyType;//定义RedType类型的关键字为整型
struct RedType//记录类型(同c10-1.h)
InfoType otherinfo;//其它数据项
typedef char KeysType;//定义关键字类型为字符型
#include<malloc.h>// malloc()等
#include<limits.h>// INT_MAX等
#include<stdio.h>// EOF(=^Z或F6),NULL
#include<stdlib.h>// atoi()
#include<math.h>// floor(),ceil(),abs()
#include<process.h>// exit()
#include<iostream.h>// cout,cin
typedef int Status;// Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean;// Boolean是布尔类型,其值是TRUE或FALSE
#define MAX_NUM_OF_KEY 8//关键字项数的最大值
#define RADIX 10//关键字基数,此时是十进制整数的基数
struct SLCell//静态链表的结点类型
KeysType keys[MAX_NUM_OF_KEY];//关键字
InfoType otheritems;//其它数据项
SLCell r[MAX_SPACE];//静态链表的可利用空间,r[0]为头结点
int keynum;//记录的当前关键字个数
int recnum;//静态链表的当前长度
void InitList(SLList&L,RedType D[],int n)
{//初始化静态链表L(把数组D中的数据存于L中)
char c[MAX_NUM_OF_KEY],c1[MAX_NUM_OF_KEY];
int i,j,max=D[0].key;// max为关键字的最大值
L.keynum=int(ceil(log10(max)));
L.r[i].otheritems=D[i-1].otherinfo;
itoa(D[i-1].key,c,10);//将10进制整型转化为字符型,存入c
for(j=strlen(c);j<L.keynum;j++)//若c的长度<max的位数,在c前补'0'
L.r[i].keys[j]=c[L.keynum-1-j];
void Distribute(SLCell r[],int i,ArrType f,ArrType e)//算法10.15
{//静态键表L的r域中记录已按(keys[0],…,keys[i-1])有序。本算法按
//第i个关键字keys[i]建立RADIX个子表,使同一子表中记录的keys[i]相同。
// f[0..RADIX-1]和e[0..RADIX-1]分别指向各子表中第一个和最后一个记录
for(p=r[0].next;p;p=r[p].next)
j=ord(r[p].keys[i]);// ord将记录中第i个关键字映射到[0..RADIX-1]
e[j]=p;//将p所指的结点插入第j个子表中
void Collect(SLCell r[],ArrType f,ArrType e)
{//本算法按keys[i]自小至大地将f[0..RADIX-1]所指各子表依次链接成
//一个链表,e[0..RADIX-1]为各子表的尾指针。算法10.16
for(j=0;!f[j];j=succ(j));//找第一个非空子表,succ为求后继函数
t=e[j];// r[0].next指向第一个非空子表中第一个结点
for(j=succ(j);j<RADIX-1&&!f[j];j=succ(j));//找下一个非空子表
r[t].next=0;// t指向最后一个非空子表中的最后一个结点
for(j=L.keynum-1;j>=0;j--)
{// L是采用静态链表表示的顺序表。对L作基数排序,使得L成为按关键字
//自小到大的有序静态链表,L.r[0]为头结点。算法10.17
L.r[L.recnum].next=0;//将L改造为静态链表
{//按最低位优先依次对各关键字进行分配和收集
Distribute(L.r,i,f,e);//第i趟分配
printf("第%d趟收集后:\n",i+1);
printf("keynum=%d recnum=%d\n",L.keynum,L.recnum);
for(j=L.keynum-1;j>=0;j--)
printf(" otheritems=%d next=%d\n",L.r[i].otheritems,L.r[i].next);
void Sort(SLList L,int adr[])//改此句(类型)
{//求得adr[1..L.length],adr[i]为静态链表L的第i个最小记录的序号
void Rearrange(SLList&L,int adr[])//改此句(类型)
{// adr给出静态链表L的有序次序,即L.r[adr[i]]是第i小的记录。
//本算法按adr重排L.r,使其有序。算法10.18(L的类型有变)
for(i=1;i<L.recnum;++i)//改此句(类型)
L.r[0]=L.r[i];//暂存记录L.r[i]
{//调整L.r[adr[j]]的记录到位直到adr[j]=i为止
RedType d[N]={{278,1},{109,2},{63,3},{930,4},{589,5},{184,6},{505,7},{269,8},{8,9},{83,10}};
printf("排序前(next域还没赋值):\n");
printf("排序后(静态链表):\n");
adr=(int*)malloc((l.recnum)*sizeof(int));
printf("排序后(重排记录):\n");
/*******************************************/
typedef int InfoType;//定义其它数据项的类型
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
InfoType otherinfo;//其它数据项,具体类型在主程中定义
RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元
void Merge(RedType SR[],RedType TR[],int i,int m,int n)
{//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]算法10.12
for(j=m+1,k=i;i<=m&&j<=n;++k)//将SR中记录由小到大地并入TR
TR[k+l]=SR[i+l];//将剩余的SR[i..m]复制到TR
TR[k+l]=SR[j+l];//将剩余的SR[j..n]复制到TR
void MSort(RedType SR[],RedType TR1[],int s, int t)
{//将SR[s..t]归并排序为TR1[s..t]。算法10.13
m=(s+t)/2;//将SR[s..t]平分为SR[s..m]和SR[m+1..t]
MSort(SR,TR2,s,m);//递归地将SR[s..m]归并为有序的TR2[s..m]
MSort(SR,TR2,m+1,t);//递归地将SR[m+1..t]归并为有序的TR2[m+1..t]
Merge(TR2,TR1,s,m,t);//将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
{//对顺序表L作归并排序。算法10.14
printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo);
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7}};
/**********************************************/
#include<malloc.h>// malloc()等
#include<limits.h>// INT_MAX等
#include<stdio.h>// EOF(=^Z或F6),NULL
#include<stdlib.h>// atoi()
#include<math.h>// floor(),ceil(),abs()
#include<process.h>// exit()
#include<iostream.h>// cout,cin
void bubble_sort(int a[],int n)
{//将a中整数序列重新排列成自小至大有序的整数序列(起泡排序)
for(i=n-1,change=TRUE;i>1&&change;--i)
int d[N]={49,38,65,97,76,13,27,49};
/****************************************************/
typedef int InfoType;//定义其它数据项的类型
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
InfoType otherinfo;//其它数据项,具体类型在主程中定义
RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元
int SelectMinKey(SqList L,int i)
{//返回在L.r[i..L.length]中key最小的记录的序号
for(j=i+1;j<=L.length;j++)
if(L.r[j].key<min)//找到更小的
{//对顺序表L作简单选择排序。算法10.9
{//选择第i小的记录,并交换到位
j=SelectMinKey(L,i);//在L.r[i..L.length]中选择key最小的记录
printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo);
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8}};
/************************************************/
#include<malloc.h>// malloc()等
#include<limits.h>// INT_MAX等
#include<stdio.h>// EOF(=^Z或F6),NULL
#include<stdlib.h>// atoi()
#include<math.h>// floor(),ceil(),abs()
#include<process.h>// exit()
#include<iostream.h>// cout,cin
typedef int Status;// Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean;// Boolean是布尔类型,其值是TRUE或FALSE
typedef int InfoType;//定义其它数据项的类型
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
InfoType otherinfo;//其它数据项,具体类型在主程中定义
RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元
int i,j,j1,k,k1,l,n=L.length;
l=(int)ceil(log(n)/log(2))+1;//完全二叉树的层数
k=(int)pow(2,l)-1;// l层完全二叉树的结点总数
k1=(int)pow(2,l-1)-1;// l-1层完全二叉树的结点总数
t=(RedType*)malloc(k*sizeof(RedType));//二叉树采用顺序存储结构
for(i=1;i<=n;i++)//将L.r赋给叶子结点
for(i=k1+n;i<k;i++)//给多余的叶子的关键字赋无穷大
t[i].key<t[i+1].key?(t[(i+1)/2-1]=t[i]):(t[(i+1)/2-1]=t[i+1]);
L.r[i+1]=t[0];//将当前最小值赋给L.r[i]
for(j=1;j<l;j++)//沿树根找结点t[0]在叶子中的序号j1
t[2*j1+1].key==t[j1].key?(j1=2*j1+1):(j1=2*j1+2);
j1=(j1+1)/2-1;//序号为j1的结点的双亲结点序号
t[2*j1+1].key<=t[2*j1+2].key?(t[j1]=t[2*j1+1]):(t[j1]=t[2*j1+2]);
printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo);
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8}};
/****************************/
typedef int InfoType;//定义其它数据项的类型
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
InfoType otherinfo;//其它数据项,具体类型在主程中定义
RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元
typedef SqList HeapType;//堆采用顺序表存储表示
void HeapAdjust(HeapType&H,int s,int m)//算法10.10
{//已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,本函数
//调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆(对其中记录的关键字而言)
{//沿key较大的孩子结点向下筛选
if(j<m&<(H.r[j].key,H.r[j+1].key))
{//对顺序表H进行堆排序。算法10.11
for(i=H.length/2;i>0;--i)//把H.r[1..H.length]建成大顶堆
{//将堆顶记录和当前未经排序子序列H.r[1..i]中最后一个记录相互交换
HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆
printf("(%d,%d)",H.r[i].key,H.r[i].otherinfo);
RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8}};
三、c语言的两种排序
要求输入10个整数,从大到小排序输出
#include<stdio.h>
int main(int argc,const char*argv[]){
scanf("%d",&num<i>);
//用两个for嵌套循环来进行数据大小比较进行排序
if(num[j]<num[k])//num[j]<num[k]
//用一个for循环来输出数组中排序好的数据
要求输入10个整数,从大到小排序输出
#include<stdio.h>
int main(int argc,const char*argv[]){
//用for来把数据一个一个读取进来
scanf("%d",&num<i>);
//用两次层for循环来比较数据,进行冒泡
if(num[k]<num[k+1])//num[k]<num[k+1]
//用一个for循环来输出数组中排序好的数据
return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。