书上说快速排序是对起泡排序的一种改进,个人感觉他俩没啥关系呢?求高人指点!
冒泡排序的思想较简单:
S1:从待排序序列的起始位置开始,从前往后依次比较各个位置和其后一位置的值得大小并执行S2。
S2:如果当前位置的值大于其后需位置的值,就把他俩的值交换。
//完成此次全序列比较后,序列最后位置的值即此序列最大值,所以其不需要在参与冒泡。
S4:将序列的最后一个位置从待冒泡的序列中移除。如果移除后待排序序列不为空则执行S1,否则冒泡结束
冒泡和快速排序的关系:
快速排序的对冒泡排序的改进就是减少了比较次数和移动次数:冒泡排序记录的比较和移动是在相邻位置进行的,每次交换只能前移或后移一个位置,因而总的比较次数和移动次数较多。在快速排序中,记录的比较和移动是从两端向中间进行的,关键码叫的较大的记录一次就能从前面移动到后面,关键码较小的记录一次就能从后面移动到前面,记录移动的距离较远,从而减少了总的比较和移动次数。
书上是这么说的,这么说了一通,是有点道理,但总是觉得这么把冒泡和快排联系在一起有点牵强。
让我感到牵强的是:冒泡是从头到尾依次比较相邻的两个元素,而快排是从序列的两端到中间一次比较,一个从头到尾,一个从两端到中间,明显是不同的。(比人才疏学浅这里一直不能理解,望高人指点)
快速排序算法描述:
S1:首先要在待排序序列选定一个中间值,在快速排序的第一次遍历(从两端向中间遍历)后,所有比这个值大的都在这个值的右边,所有比这个值小的都在这个值的左边。这个中间值的选取没有好的办法,默认选择序列的第一个值。
S2:那么S1中所描述的场景(一次遍历后的场景)是怎么实现的呢?首先定义三个变量:i,j;i,j保存遍历时的未遍历的区间,初始i保存最后面元素的下标,j保存最前面元素的下标。
S3.首先从前往后遍历。
S4.将下标为i位置的值与小标为j位置的值进行比较。如果i位置的值小于等于j位置的值,则将i的值加一,执行S5;反之则将i位置的值与j位置的值互换,执行S6。
S5.当i等于j的时候则第一次遍历完成,执行S7,否则执行S4。
S6.i,j位置的值互换后则变换遍历方向:从后向前遍历,将j加一,当i等于j的时候则第一次遍历完成,执行S7,否则执行S4。
S7.到此第一次遍历完成,之后就是一个递归的过程,将序列划分为两个子序列,继续执行上面的算法,如何划分呢?
以i为分割点,i前的元素为一个子序列,i之后的为另一个子序列。直到两个子序列的长度为0时,则序列已有序。