C语言实现顺序表字符型数据排序

 实现直接插入、冒泡、直接选择排序算法。

#include <stdio.h>
#include <stdlib.h>

typedef char InfoType;

#define n 10					//假设的文件长度,即待排序的记录数目
typedef char KeyType;			//假设的关键字类型
typedef struct {				//记录类型
	KeyType key;				//关键字项
	InfoType otherinfo;			//其它数据项,类型InfoType依赖于具体应用而定义
} RecType;
typedef RecType SeqList[n+1];	//SeqList为顺序表类型,表中第0个单元一般用作哨兵


void InsertSort(SeqList R);  
void BubbleSort(SeqList R);
void SelectSort(SeqList R);
//测试用例 
//阴阳乾兑离震巽坎艮坤 
int main()
{
	
	int i;
	SeqList R;  //R是大小为n+1的结构数组 

	char choice;
	while (1)
	{
		system("cls");
		printf("\n\n\n\n");
		printf("\t\t               线性表的排序  \n");
		printf("\t\t======================================");
		printf("\n\n");
		printf("\t\t             1:建立线性表            \n");
		printf("\t\t             2:显示线性表            \n");
		printf("\t\t             3:插入排序              \n");
		printf("\t\t             4:冒泡排序              \n");
		printf("\t\t             5:直接选择排序          \n");
		printf("\n");
		printf("\t\t             0:退出        \n");
		printf("\n");
		printf("\t\t请选择:");

		choice = getchar();
		system("cls");
		
		switch(choice)
		{
			case '1':				
				printf("请输入欲排序的数(10个):\n");
	            for (i=1;i<=n;i++)
	             	scanf("%c",&R[i].key);
				printf("线性表创建成功!\n");
				system("Pause");
				break;
			case '2':
				printf("线性表中的数据为:\n");
				for (i=1;i<=n;i++)
		            printf("%d ",R[i].key);
				system("Pause");
				break;
			case '3':				
            	InsertSort(R);
				printf("插入排序成功!\n");
				system("Pause");
				break;
			case '4':				
				BubbleSort(R);
				printf("冒泡排序成功!\n");
				system("Pause");
				break;
			case '5':				
				SelectSort(R);
				printf("直接选择排序成功!\n");
				system("Pause");
				break;						
			case '0':
				exit(0);
		}
	}
}


//对顺序表R中的记录R[1..n]按递增序进行插入排序
void InsertSort(SeqList R)
{
	int i,j;
	for(i=2;i<=n;++i)
	if( R[i].key<R[i-1].key) { // 将 R[i] 插入有序子表
		R[0]=R[i]; // 复制为哨兵
		R[i]=R[i-1];
		for(j=i-2; R[0].key<R[j].key;--j)
			R[j+1]=R[j]; // 记录后移
		R[j+1]=R[0]; // 插入到正确位置

	}
}

//R[1..n]是待排序的文件,采用自下而上扫描对R做冒泡排序
void BubbleSort(SeqList R)
{
	int m,i,j,flag=1; RecType x;
	m=n-1;
	while((m>0)&&(flag==1))
	{ flag=0;
	for(j=1;j<=m;j++)
	if(R[j].key>R[j+1].key)
	{ flag=1;
	x=R[j];R[j]=R[j+1];R[j+1]=x; // 交换
	}//endif
	m--;
	}//endwhile
}

//对R[1..n]进行直接选择排序,用R[0]做暂存单元
void SelectSort(SeqList R)
{
	RecType x;
	int k,i,j;
	for (i=1; i<n; ++i)
	{ // 在 R[i..n] 中选择 key 最小的记录
	k=i;
	for( j=i+1;j<=n ; j++)//遍历找最小
		if ( R[j].key <R[k].key) k=j;
	if(k!=i) {x=R[k];R[k]=R[i];R[i]=x; }	//交换
	}
}

声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值