《排序算法篇》快排的递归与非递归

您所在的位置:网站首页 递归算法和非递归算法的优缺点分析图表 《排序算法篇》快排的递归与非递归

《排序算法篇》快排的递归与非递归

#《排序算法篇》快排的递归与非递归| 来源: 网络整理| 查看: 265

2.1快排思想

快排本质上是一种交换排序,我们先从单趟的角度来说:快排的单趟排序会让你选择Key放在数组正确的位置,什么是正确的位置?就是你单趟排序后,这个数(Key)就已经排好了,后续不需要改变了,怎么保证它处于正确的位置呢?只要它的左边的所有数都小于等于它,右边的所有数都大于等于它,那么它就处于正确的位置。(升序)。

快排单趟步骤:从数组选择一个Key的数字,一般选择最左边或者最右边,这里我选择数组最左边的数,举例:5 3 2 8 6 1 10 9 3 4 7,这里的Keyi就是0,a[ keyi ]是5

如何进行交换数组元素让5放在正确的位置?

2.2三种单趟排序

这里有三种快排的单趟排序算法:

第一种:hoare,也是最早发明快速排序算法人写的-----托尼·霍尔(Tony Hoare)

这种方法是:先选一个Keyi,取两个整形变量left、right,这两个整形变量代表数组下标,初始它们分别指向0和n-1。然后让right先移动,找到大于a[ keyi ]的数,然后right停下来,再让left移动,找到小于a[ keyi ]的数,停下,再交换a[ left ]和a[ right ],如果在right或者left移动的途中,right==left,即right和left相遇的时候,right和left必然指向的是比a[ keyi ]小的数。然后a[keyi]和这个比它小的数交换(相遇点),它们最终a[keyi]处于正确位置,即它的左边所有数都小于等于它,右边所有数都大于等于它。

图示:

 需要注意的是:需让right先走,然后left在走。否则它们相遇点可能不是比a[keyi]小的数。

参考代码:

int Q_PartSort1(int* a, int begin, int end)//hoare { int keyi = begin; int left = begin; int right = end; while (left < right) { while (left < right && a[right] >= a[keyi])//右边找小于a[keyi]的数 { right--; } while (left < right && a[left] = key) { right--; } a[hole] = a[right]; hole = right; while (left < right && a[left] >1); if ( (a[mid] >= a[begin] && a[mid] =a[end] && a[mid] = a[mid] && a[begin]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3