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

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

同时提供了参考的代码。

1,分析结果

  插入排序 冒泡排序 选择排序
比较次数      
最佳情况 ñ N ^ 2 N ^ 2
平均情况 N ^ 2 N ^ 2 N ^ 2
最差情况 N ^ 2 N ^ 2 N ^ 2
交换次数      
最佳情况 0 0 ñ
平均情况 N ^ 2 N ^ 2 ñ
最差情况 N ^ 2 N ^ 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");
}

猜你喜欢

转载自blog.csdn.net/sinan1995/article/details/81095259