c语言实现选择排序

选择排序的思想是将待排序的数组进行循环,从data[1]开始,分别用data[2]到data[n-1]进行比较,如果比data[1]小,则记录下data[j]在数组中的位置,将j复制到index中,在继续让data[2]到data[n-1]与data[index]进行比较,如果存在比data[index]小的那么继续将其复制到data[index]中,這样一遍循环下来便可找到data[1]到data[n-1]中最小的数字,接下来将data[1]最小的数data[index]进行交换,用data[0]做为哨兵,這样循环一遍便可以找到最小的元素,以此类推,循环n-1遍便可以完成整个排序过程。需要注意的是 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。


#include<stdio.h>

typedef struct{
	int key;
	char name[10];
}Data;

Data listOld[]={{0,"num0"},{49,"num1"},{37,"num2"},{56,"num3"},{67,"num4"},{43,"num5"},{97,"num6"},{23,"num7"},{49,"num8"}};

void printfData(Data *pdata,int n);
void selectSort(Data *pdata,int n);

int main(int argc,char argv[]){
	selectSort(listOld,9);
	printfData(listOld,9);
	return 0;
}


void printfData(Data *pdata,int n)
{
    int i;
	for(i=1;i<n;i++)
	{
			printf("%d,%s ",pdata[i].key,pdata[i].name);
	}
	printf("\n");

}

void selectSort(Data *pdata,int n){
	int index,i,j;
	for(i=1;i<n;i++){
		index = i;
		pdata[0] = pdata[i];
		for(j=i+1;j<n;j++){
			if(pdata[j].key<pdata[index].key)
			{
				index = j;
			}
		}
		if(index!=i){
					pdata[0]=pdata[i];
					pdata[i]=pdata[index];
					pdata[index]=pdata[0];

		}
	}
}

#include<stdio.h>

typedef struct{
	int key;
	char name[10];
}Data;

Data listOld[]={{0,"num0"},{49,"num1"},{37,"num2"},{56,"num3"},{67,"num4"},{43,"num5"},{97,"num6"},{23,"num7"},{49,"num8"}};

void printfData(Data *pdata,int n);
void selectSort(Data *pdata,int n);

int main(int argc,char argv[]){
	selectSort(listOld,9);
	printfData(listOld,9);
	return 0;
}


void printfData(Data *pdata,int n)
{
    int i;
	for(i=1;i<n;i++)
	{
			printf("%d,%s ",pdata[i].key,pdata[i].name);
	}
	printf("\n");

}

void selectSort(Data *pdata,int n){
	int index,i,j;
	for(i=1;i<n;i++){
		index = i;
		pdata[0] = pdata[i];
		for(j=i+1;j<n;j++){
			if(pdata[j].key<pdata[index].key)
			{
				index = j;
			}
		}
		if(index!=i){
					pdata[0]=pdata[i];
					pdata[i]=pdata[index];
					pdata[index]=pdata[0];

		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值