交换排序、选择排序

交换排序借鉴了求最大值、最小值的思想。

接下来我们以降序排序为例,简单介绍以下排序过程。

首先进行第一轮比较,参与比较的数有n个,将第一个数分别与后面所有数进行比较,若后面的数较大,则交换后面这个数和第一个数的位置;这一轮结束后,就求出了一个最大的数放在了第一个数的位置。然后进入第二轮比较,参与比较的数变为n-1个,在这n-1个数中再按上述方式进行比较。比较出第二大的数字放在第二个位置,依次比较n-1轮。

#include<stdio.h>
#define N 40
 //输入数据函数
int shuru(int a[]) 
{
	int i=-1;
	printf("请输入数据(输入负数时表示停止):\n");
	do{
		i++;
		printf("请输入第%d个数:",i);
		scanf("%d",&a[i]); 
	}while(a[i]>=0); 
	return i;
}
//交换排序
void DataSort(int a[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[j]>a[i])
			{
				temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}
		}
	}
 } 
 //交换排序
void dataSort(int a[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[j]<a[i])
			{
				temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}
		}
	}
 } 
 //打印排序后数字
 void PrintScore(int a[],int n) 
 {
 	int i;
	 for(i=0;i<n;i++)
	 {
	 	printf("%4d",a[i]);
	  } 
	  printf("\n");
 }
int main()
{
	int a[N],n;
	n=shuru(a);
	int choose;
	printf("1表示降序,2表示升序\n"); 
	scanf("%d",&choose);
	switch(choose)
	{
		case 1:
			DataSort(a,n);
			break;
		case 2:
			dataSort(a,n);
			break;
		default:
			break;
	}
	printf("排序后输出的序列为:\n"); 
	PrintScore(a,n);
	return 0;
	
 } 

交换排序相对于选择法排序效率较低,我们在交换排序中,在余下的数中找出最大值再与第i+1个数交换位置,这样每一轮比较中最多只有一次两数交换操作,整个算法最多有n-1次两数交换操作。

选择法排序函数代码:

//选择法排序 
 void DATAsort(int a[],int n)
 {
 	int i,j,k,temp;
	 for(i=0;i<n-1;i++)
	 {
	 	k=i;//以第i个下标数开始 
	 	for(j=i+1;j<n;j++)
	 	{
	 		if(a[j]>a[k])//按大到小排序
	 		{
	 			k=j;//记录最大数下标位置 
			 }
		 }
		 if(k!=i)
		 {
		 	temp=a[k];
		 	a[k]=a[i];
		 	a[i]=temp;
		  } 
	  } 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值