您的位置:首页 > 其它

三种简单排序的对比与分析(未完待续)

2006-11-27 19:54 316 查看
插入排序,冒泡排序和选择排序是三种时间复杂度为O(n^2)的排序算法。本文并不想对这三种排序进行教科书式的讲解,只想以不一样的视角,通过对这三种排序算法的对比解说,对三种简单排序进行对比分析,帮助对它们的理解。想像一下这个场景:你在一个图书馆里工作,负责把读者送还的书按一定顺序摆到书架上。那么,当你抱着一摞零散的书,你将怎么进行自己的工作呢?

1.两种解决之道:选择位置与选择元素

(1)你可以这么做:从那摞零散的书里,从上到下依次拿书,放回书架。显然,在放回每一本书的时候,你要看看应该放在拿个位置。如果书架上的书按拼音排序摆放,那么:书架上(当你已经放好三本书):

C 操 数
语 作 据
言 系 结
统 构

散落的书:

操作系统
C语言
数据机构
--------- <-以下还需排
Java语言
编译原理
......

显然,按照上面的想法,接着的事情,我们应该先抽出 java语言,并且插入到数据结构 的前面。然后,是编译原理,插入到操作系统前面,再是后面的书,一本本如下操作,直到完成。

(2)你也可以这样想,是否可以在散落的书里面找到一本最靠前的书,放到书架上,然后再找次小的,放到合适的位置,重复以上步骤完成之。ok,那么过程应该是这样:编译原理(假设这是散落书里,应该放的最前面的一本),放到书架的最前面;然后是C语言,放到编译原理后面,再是操作系统,......

书架上的摆放(三本过后):

编 C 操
译 语 作
原 言 系
理 统

散落的书:

---------- <-上面的以排好
数据机构
Java语言
......

接下来,当然是选择java语言,排到操作系统后面,之后是数据结构,放到java语言后面。

2.看出来了吗,这两种思想的区别是:前一种,你是依次从待放书籍中把书拿出来,放到书架上合适的位置;而后一种,你将从待排书籍中选择一本最靠前的,然后,只需要放到书架上已放好书的末尾就行了。简单说来,这是两种选择,前一个方法,你选择合适的位置,而后以种方法,你选择合适的书籍。然后,我们把这两种思想运用于排序,就是插入排序和选择排序。先尝试写一下:

看核心,那么如果写插入算法,本应该这样:

for (int i = 0; i < n; i++)
{
//把array[i] 插入到合适的位置;
}

而选择排序,应该是,

for (int i = 0; i < n; i++)
{
//选择合适的元素,放到第 i 个位置;
}

3.那么,该如何完整它们呢?

先是插入排序:

for (int i = 1; i < n; i++ ) //1
{
for (int j = i; j > 0; j--) //2
{
if (array[j] > array[j-1]) //3
{
swap (array[j],array[j - 1]);
}
else break; //4
}
}

//1.假设待排元素从0下标开始,需要对比后插到合适的位置元素是从 1 到 n - 1,0元素不需要比较,可以直接放入0号位置;

//2.每个元素与前一个元素比较,j 显然只要到 1 元素即可;

//3.如果两元素是逆序, 则交换;

//4.这个应该注意:因为已排好的元素是有序的,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐