C--三种常用的排序方法

在日常中用到的排序比较多,最熟悉的莫过于冒泡排序了,在这里分析了几种排序所需要的比较次数以及交换次数。

同时提供了参考的代码。

1,分析结果

 插入排序冒泡排序选择排序
比较次数   
最佳情况ñN ^ 2N ^ 2
平均情况N ^ 2N ^ 2N ^ 2
最差情况N ^ 2N ^ 2N ^ 2
交换次数   
最佳情况00ñ
平均情况N ^ 2N ^ 2ñ
最差情况N ^ 2N ^ 2ñ

 

我们可以看到这三种排序算法大部分消耗的时间都是呈指数形式,在小数据的排序情况下消耗的时间还不是很明显,但是在比较多的数据的时候消耗的时间就会比较让人难受了,在另外的一篇文章中分析了另外两种排序算法,相对于这三种排序算法,在多数据的排序上效率要高很多。

2,代码:

//插入排序:最差情况下排序时间代价为n^2;最佳的排序情况时间代价为n;交换次数较多
void fun()
{
	int data[10] = {1,6,4,7,3,17,2,5,9,12};
	int i,j,m;

	for(i=1; i<10; i++){
		for(j=i; (j>0)&&(data[j]<data[j-1]); j--){
			data[j]   = data[j]^data[j-1];
			data[j-1] = data[j]^data[j-1];
			data[j]   = data[j]^data[j-1];
		}
	}
	for(i=0; i<10; i++){
		printf("%d--",data[i]);
	}
	printf("\n");
}
//冒泡排序:排序时间代价总是n^2;交换次数较多
void fun1()
{
	int data[10] = {1,6,4,7,3,17,2,5,9,12};
	int i,j;

	for(i=0; i<9; i++){
		for(j=9; j>1; j--){
			if(data[j] < data[j-1]){
				data[j]   = data[j]^data[j-1];
				data[j-1] = data[j]^data[j-1];
				data[j]   = data[j]^data[j-1];
			}
		}
	}

	for(i=0; i<10; i++){
		printf("%d--",data[i]);
	}
	printf("\n");
}
//选择排序:排序时间代价总是n^2;交换次数为n;交换次数相对于冒泡排序少很多
//注意,这里不能使用异或来进行交换,因为可能会交换到自己本身,交换到本身的时候会为0
void fun2()
{
	int data[10] = {1,6,4,7,3,17,2,5,9,12};
	int i,j,k,m;

	for(i=0; i<9; i++){
		k = i;
		for(j=9; j>i; j--){
			if(data[j] < data[k]){
				k = j;
			}
		}
		m = data[i];
		data[i] = data[k];
		data[k] = m;
	}
	for(i=0; i<10; i++){
		printf("%d--",data[i]);
	}
	printf("\n");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值