C语言实现排序代码

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
typedef int keyType;
typedef struct{
	keyType key;	//关键字码 
	
}RecType; 

typedef struct SqList{	//数组结构体 
	RecType r[MAX_SIZE];
	int length;
}SqList;

//输入
SqList write(SqList L){
	int i=1;
	char x;	//判断是否回车 
	do{
		scanf("%d",&L.r[i].key); 
		L.length=i;
		i++;			
	}while((x=getchar())!='\n');//输入回车键表示停止输入
							 		
		return L;	
}

//打印输出	 
void output(SqList L){
	for(int j=1;j<=L.length;j++){
		 	printf("%d  ",L.r[j].key);
		 } 
		 printf("\n");
}	 

//直接插入排序 
void InsertSort(SqList &S)
{	SqList L=S;
	int i,j;
	for( i=2; i<=L.length;i++)
	{
		if(L.r[i].key < L.r[i-1].key)
		{
			L.r[0] = L.r[i];	//记录第零号位置的数字 
			L.r[i] = L.r[i-1];
			for( j=i-2; (L.r[0].key < L.r[j].key); j--)
				L.r[j+1] = L.r[j];
			L.r[j+1] = L.r[0];
		}
	}
	
	//打印
	printf("直接插入排序:\n"); 
		output(L);	
}

//冒泡排序
void BubbleSort(SqList &S)
{	
	SqList L=S;
	int i,j;
	for(i=1;i<L.length;i++)
	{
		int flag = 1;
		for(j=1;j<=L.length-i;j++)
			if(L.r[j].key > L.r[j+1].key)
			{
				flag = 0;
				int temp;
				temp = L.r[j].key;
				L.r[j].key = L.r[j+1].key;
				L.r[j+1].key = temp;
			}
			//若无交换说明已经有序
			if(flag==1)
				break;
	}
	
	//打印
	printf("冒泡排序:\n"); 
	output(L);
		
}

//快速排序主体方法 
int Partition(SqList &L,int low,int high)
{
	//分割区域函数
	L.r[0] = L.r[low];
	int pivotkey = L.r[low].key;//一般将顺序表第一个元素作为支点
	while(low < high)
	{
		while(low<high && L.r[high].key>=pivotkey)
			high--;
		L.r[low] = L.r[high];
		while(low<high && L.r[low].key<=pivotkey)
			low++;
		L.r[high] = L.r[low];
	}
	L.r[low] = L.r[0];//返回枢轴位置
	return low;
}

//递归函数 
void QSort(SqList &L,int low,int high)
{
//每张子表的快速排序
	
	if(low<high)
	{ 
		int pivotloc = Partition(L,low,high);
			QSort(L,low,pivotloc-1);
			QSort(L,pivotloc+1,high);
	}
	
}

//快速排序 
void quick_Sort(SqList &S){	
	SqList L=S;
	QSort(L,1,L.length);
	//打印
	printf("快速排序:\n"); 
	output(L);
}

//简单选择排序
void simple_selection_sort(SqList &S)
{	
	SqList L=S;
	int min;
	int j;
	for (int i = 1; i <L.length; i++) 
	{	// 选择第i小的记录,并交换
		j = i;
		min = L.r[i].key;
		for (int k = i; k <= L.length; k++) 
		{	// 在R[i..n-1]中选择最小的记录
			if (L.r[k].key < min) 
			{	min = L.r[k].key ;
				j = k;
			}
		}
		if (i != j) 
		{	// 与第i个记录交换
			int temp = L.r[i].key;
			L.r[i].key = L.r[j].key;
		L.r[j].key = temp;
		}
	}
	
	//打印
	printf("简单选择排序:\n"); 
		output(L);
} 



//	22 34 56 67 88 55 3 1
int main(){
	SqList S;
	 S=write(S);
	 //直接插入排序 
	 InsertSort(S);
	 //冒泡排序 
	 BubbleSort(S);
	 //简单选择排序
	 simple_selection_sort(S); 
	 //快速排序
	 quick_Sort(S); 
	system("pause");	
		return 0;			
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值