冒泡排序和快速排序都是交换排序,交换排序是内部排序。
过程:比较相邻的元素,根据要求判断是否需要交换他们的位置,直到排序结束。
例如给出:1 3 5 4 2
从后往前比较:
第一趟:
开始 2与4比较:2小,所以交换位置后:1 3 5 2 4
然后 2与5比较:5大,所以交换位置后:1 3 2 5 4
然后 2与3比较:3大,所以交换位置后:1 2 3 5 4
然后 2与1比较:2大,所以不交换位置:1 2 3 5 4
第一趟结束后:1 2 3 5 4 共比较了4次,交换了3次
此时第一趟排序结束,我们能确定的是 第一个元素一定是最小的元素1,所以第二趟排序只需要比较到1后一个元素。
第二趟:
开始 4与5比较:5大,所以交换位置后:1 2 3 4 5
然后 4与3比较:3小,所以不交换位置:1 2 3 4 5
然后 2与3比较:2小,所以不交换位置:1 2 3 4 5
然后 因为已知1是最小的元素,所以2无需再比较,比较第二趟比较结束
第二趟结束后,可知第二趟比较了3次,交换了1次
此时第二趟排序结束,我们能确定的是 第二个元素一定是第二小的元素2,所以第三趟排序只需要比较到2后一个元素。
第三趟
开始 5与4比较:4小,所以不交换位置:1 2 3 4 5
然后 4与3比较:3小,所以不交换位置:1 2 3 4 5
此时第三趟结束,可知比较了两次,并没有交换
此时按道理应该开始第四趟比较,也就是比较4和5,但是我们通过第三趟比较后可以知道,顺序已经排好了,所以再次比较,只会增加算法的时间,降低算法的性能,所以我们应该设置一个标记变量flag,当比较没有交换后,我们可以跳出循环,打印结果。
上述比较的详细过程与结果
在实际写的过程中,我们无需知道详细步骤,只要结果就行,算法如下
接着讨论算法的时间复杂度
当本身就是正序的时候,只需要比较(n-1)次就行,时间复杂度为O(n)
当完全逆序的时候,就是最坏的情况,此时需要比较(1+2+3+......+(n-1))
=n*(n-1)/2次,并且做同等数量级的交换次数,
所以总的时间复杂度为O(n^2)