快速排序练习(二)
2015-03-06 13:26
148 查看
上一篇方法一,在一些特殊输入下时间复杂度会退化为n平方,比如:a = [5,5,5,5,5,5,5]全部一样的情况下
方法二采用从左右两个方向遍历列表:
1.从左向右找到大于参考值t的元素,
2.从右向左找到小于参考值t的元素,
3.然后交换两个元素
具体实现如下代码所示:
需要注意的是在一次排序过程中,m必须为最后一个小于等于t的索引,然后将参考值t换到m的位置,完成一次筛选。
一次成功的筛选要求保证列表分为三个区间,小于t,等于t,大于t。如果存在多个相同值t的情况,则小于等于t,等于t,大于等于t
方法二仍然在一些常见的情况下,复杂度会退化,比如一个本来就有序的列表。还可以进一步改进该算法:参考值t改为随机选择,然后和第0个元素交换位置;对于基本有序的列表采用插入排序的方法。
方法二采用从左右两个方向遍历列表:
1.从左向右找到大于参考值t的元素,
2.从右向左找到小于参考值t的元素,
3.然后交换两个元素
具体实现如下代码所示:
需要注意的是在一次排序过程中,m必须为最后一个小于等于t的索引,然后将参考值t换到m的位置,完成一次筛选。
一次成功的筛选要求保证列表分为三个区间,小于t,等于t,大于t。如果存在多个相同值t的情况,则小于等于t,等于t,大于等于t
a = range(0,10) random.shuffle(a) print a def qsort2(a, l, u): if l >= u: return #选取列表第一个值为参考,以m为分界点,左边小于等于t,右边大于t m = l t = a[l] #和方法一不同,这里使用了两个for循环 while(1): #从左向右,找到比t大的值 for i in range(l+1, j+1): if a[i] > t: break else: #没有找到,i为最后一个比t小的值的索引 m = i break #从右向左,找到比t小的值 for j in range(u, i-1, -1): if a[j] < t: break else: #没有找到,j为第一个比t大的值 m = i - 1 break #交换i和j的值 a[i],a[j] = a[j],a[i] #循环结束,将参考值换到中间位置,完成一次筛选 a[l],a[m] = a[m],a[l] #分别递归,m-1和m+1两个区间 qsort2(a, l, m-1) qsort2(a, m+1, u) qsort2(a, 0, len(a)-1) print a
方法二仍然在一些常见的情况下,复杂度会退化,比如一个本来就有序的列表。还可以进一步改进该算法:参考值t改为随机选择,然后和第0个元素交换位置;对于基本有序的列表采用插入排序的方法。
相关文章推荐
- 快速排序和二分查找的练习
- 数据结构练习:快速排序
- 快速排序练习(一)
- 数据结构练习:快速排序
- 【编程练习】快速排序,Java和Python实现
- 练习《算法导论》之排序:插入排序,归并排序,堆排序,快速排序
- 编程练习:快速排序
- 快速排序和二分查找的练习
- 第七章快速排序之“快速插入排序”(练习7.4-5)
- Kotlin练习-快速排序
- 快速排序反复练习
- 快速排序2(复习)
- 快速排序
- 排序算法(五)——快速排序
- 递归与分治策略-2.8快速排序
- codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数
- 快速排序
- 快速排序+调整数组顺序使奇数位于偶数前面
- [每日练习]三种冒泡排序方法
- 冒泡排序、选择排序、快速排序、二分法查找