在日常中用到的排序比较多,最熟悉的莫过于冒泡排序了,在这里分析了几种排序所需要的比较次数以及交换次数。
同时提供了参考的代码。
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");
}