经典排序算法中,有好几种排序,下边说下冒泡排序和快速排序的理解与实现,记太多容易混乱;
1.冒泡排序:字面理解,值大的数字一层一层比较往最上边排,就像水里的气泡一样,从水底某个位置,往上冒;
思想:
第一次:从数组的最左边开始,取第一个元素与第二个元素比较,小的往前边放,大的往后边放;然后取,第二个元素与第三个元素比较, 大的往第三的位置放,小的放在第二位置,,然后取第三元素与第四元素比较,,第四与第五,,,,,,,总共比较n-1次,最大元素出现在最右边,第一次结束;
第二次:从数组的最左边开始,取第一个元素与第二个元素比较,小的往前边放,大的往后边放;然后取,第二个元素与第三个元素比较, 大的往第三的位置放,小的放在第二位置,,然后取第三元素与第四元素比较,,第四与第五,,,,,,,总共比较n-2次,第二个大元素出现在倒数第二个位置,第二次结束;
第三次,第四次,,,,,以此类推,总共比较比较n-1次(以上n均为数组长度)
冒泡排序的时间复杂度:O(n^2)
冒泡排序实现 测试2.快速排序
思想:第一次:取数组的第一个元素a[0],作为标值key(此时相当于a[0]放入key中,a[0]位置为空),所以从数组的最右边开始,分别与key值比较,如果比key值大,那么放在右边不动 ,,一直比较,知道遇到比key值小的,放在a[0]位置,此时右边空出一个位置,然后,从左边开始分别与key值比较,比key小的在左边不变,遇到比key值大的,放到刚才右边空出的位置,接着从刚放在右边的位置的前边开始, 分别与key值比较,比key大的不动,比key小的放在左边空下的位置,,,,,如此往复,直到,左右两边相遇停止比较,在相遇的位置把key值(也就是a[0])放进去.此时左边的全是比a[0]小的值,右边的全是比a[0]大的值,相当于用a[0]把数组分成[left,n-1],[n+1,right]两个数组,n位置为存放a[0]值,也就是key的值,第一次比较过程结束
第二次:对上次分割成的两个数组,[left,n-1]和[n+1,right],分别取第一个位置的值做第一次比较的过程;
第三次:第二次结束又会把两个数组分割成四个数组,分别取第一个位置的值做第一次比较的过程;直到每个数组的长度为1,停止,此时每个数组都保证了,右边大于左边,那么大数组肯定是有序的,就拍好序了;
快速排序实现 测试快速排序的思想有点绕,要理解的话,还是要多动脑经想想,如果理解了就觉得很简单了。
网友评论