详谈直接插入排序、冒泡排序时间复杂度过程分析----软考

想了解时间复杂度首先要将排序过程弄懂。

直接插入排序

首先有一组n个数的数组。我们进行升序排列。

先选前两个数进行比较,进行升序排列组成一个有序序列。然后每次从数组后面的无序序列中拿一个数进行比较。找到合适位置插入。

 

最好情况

数组本来就是升序数组,每趟排序只需要做一次比较,并且不需要移动元素。n个元素就只需要比较n-1次即可。

举例说明:1、2、3、4、5、6

1与2比较,2比1大,无序移动,1.、2现在排好序了,接下来从3、4、5、6中拿出打头的3与2进行比较,比2大,就不需要与1在进行比较了。3在2后面,无需移动。以此类推,比较5次就好。

5可以直接由n-1得到的,所以取n-1的最大次幂n为时间复杂度。

 

最坏情况

数组原本是降序数组,每次排序都要与之前排好序的有序序列的所有数进行比较,n个元素要比较n*(n-1)次

举例说明:6、5、4、3、2、1

6与5比较,6比5大,讲6放在5后面,5、6排好序,接下来从4、3、2、1中拿出打头的4与6比较,4比6小,则4继续与5比较,同样4还是小,但是5现在为排好序的序列第一个数,所以4直接插入到5前面,4、5、6排好序,这次比较了两次。以此类推,后面会比较3次、4次、5次。

用代数法进行计算,n个数的降序序列排成升序序列,要比较这么多1+2+3+···+n-1次,1+2+3+···+n-1可以化简成n^2-n,所以取n的最大次幂n^2为时间复杂度

冒泡排序

同样也是一组n个数的数组。我们进行升序排列。

首先将第一个数和第二个数进行比较,若为逆序,则交换这两个数,然后比较第二个和第三个数,以此类推,直到比较到结束为止。第一趟冒泡比较出最大的数放在第n个数的位置。然后进行第二趟排序,对前n-1个数进行相同的操作,选出前n-1个数中最大的放在n-1位置上。反复进行几趟排序操作,直到所有数有序排列。

 

最好情况

数组本来就是升序数组,每次比较不需要移动元素。n个元素进行一趟排序操作比较n-1次即可。

举例说明:1、2、3、4、5、6

1与2比较,2比1大,无序移动,1.、2现在排好序了,接下来2、3比较也无需移动。再3、4比较,以此类推,比较5次就好。

5可以直接由n-1得到的,所以取n-1的最大次幂n为时间复杂度。

 

最坏情况

数组原本是降序数组,每趟排序都要将前面最大的数交换到最后面,n个元素要比较n*(n-1)次

举例说明:6、5、4、3、2、1

6与5比较6大,交换位置,6和4比较,交换位置,以此类推,一直到6被交换到最后一位,比较了5次,第一趟排序完,目前队列还不是有序的,再次进行,第二趟比较4次,剩下的依次比较3、2、1次。

用代数法进行计算,n个数的降序序列排成升序序列,要比较(n-1)+(n-2)+···+2+1可以化简成n^2-n,所以取n的最大次幂n^2为时间复杂度

 

为什么将直接插入排序和冒泡排序放到一起讲时间复杂度?

因为这两个排序过程非常相似,唯一的不同就是,冒泡排序每次比较完之后,当符合排序条件时,它就会马上与相比较的数互换位置。而直接插入排序是只要满足条件就一直比较,只有在找到合适位置时才插入进去。相对来说,直接插入排序比较方便。

但是两个排序方法对同一组数进行排序,比较的次数都是一样的。所以时间复杂度也是一样的。

发布了62 篇原创文章 · 获赞 39 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/liangjiabao5555/article/details/89639012