交换排序借鉴了求最大值、最小值的思想。
接下来我们以降序排序为例,简单介绍以下排序过程。
首先进行第一轮比较,参与比较的数有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;
}
}
}