算法导论 第七章 快速排序(python)

用的最多的排序

平均性能:O(nlogn){随机化nlogn}

原地址排序

稳定性:不稳定

思想:分治 (切分左右)

学习方式:自己在纸上走一遍

 

def PARTITION(A,p,r):
    x = A[r] # 锚点 主元{大于它放一边,小于的放另一边}
    i = p - 1
    for j in range(p,r):
        if A[j] <= x:
            i += 1
            A[i],A[j] = A[j],A[i]
    A[i+1],A[r] = A[r],A[i+1]
    return i + 1

def QUICKSORT(A,p,r):
    if p < r: #分治
        q = PARTITION(A,p,r)
        QUICKSORT(A,p,q-1)
        QUICKSORT(A,q+1,r)

if __name__ == "__main__":
    A = [2,8,7,1,3,5,6,4]
    QUICKSORT(A,0,len(A)-1)
    print(A)
‘‘‘

=============== RESTART: F:/python/algorithms/7_1_quicksort.py ===============
[1, 2, 3, 4, 5, 6, 7, 8]

win7+python3.5.1

‘‘‘

随机快速排序

import random

def PARTITION(A,p,r):
    x = A[r] # 锚点 主元{大于它放一边,小于的放另一边}
    i = p - 1
    for j in range(p,r):
        if A[j] <= x:
            i += 1
            A[i],A[j] = A[j],A[i]
    A[i+1],A[r] = A[r],A[i+1]
    return i + 1

def RANDOMIZED_PARTITION(A,p,r):
    i = random.randint(p,r) #随机的变化
    A[i],A[r] = A[r],A[i]
    return PARTITION(A,p,r)

def RANDOMIZED_QUICKSORT(A,p,r):
    if p < r: #分治
        q = RANDOMIZED_PARTITION(A,p,r)
        RANDOMIZED_QUICKSORT(A,p,q-1)
        RANDOMIZED_QUICKSORT(A,q+1,r)

if __name__ == "__main__":
    A = [2,8,7,1,3,5,6,4]
    RANDOMIZED_QUICKSORT(A,0,len(A)-1)
    print(A)
‘‘‘

=============== RESTART: F:/python/algorithms/7_1_quicksort.py ===============
[1, 2, 3, 4, 5, 6, 7, 8]

win7+python3.5.1

‘‘‘
时间: 2024-08-08 05:21:14

算法导论 第七章 快速排序(python)的相关文章

算法导论第七章快速排序

一.快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法.现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1).快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择.原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序. (2).快速排序的思想和合并排序一样,即分治.快排排序的分治思想体现在: a.首先从待排序的数中选择一个作为基数,

算法导论 第7章 快速排序

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小. 快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要:相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的. /

算法导论--第七章、快速排序

1. 快速排序描述: 基于分治模式,分为分解.解决和合并三部分: 1)分解: 将数组A[p..r]划分为两个子数组A[p..q-1]和A[q+1..r],是的A[p..q-1]中每个元素都小于或等于A(q) 2)解决: 通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]排序 3)合并: 合并两个有序的数组,A[p..r] 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MaxSize 8 5 6 int

算法导论第7章快速排序

快速排序 #include <stdint.h> #include <iostream> // QUICKSORT(A, p, r) // if p < r // q = PARTITION(A, p, r) // QUICKSORT(A, p, q - 1) // QUICKSORT(A, q + 1, r) // To sort an entire array, the initial call is QUICKSORT(A, 1, A.length) // PARTIT

算法导论 第7章 高速排序

高速排序在最坏情况下的时间复杂度为O(n^2),尽管在最坏情况下执行时间比較差,可是高速排序一般是用于排序的最佳选择.由于其平均性能相当好,期望的执行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子非常小. 高速排序和合并排序有相似之处,都是须要划分序列,在合并排序中.划分的过程非常easy.直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程非常重要.相比合并排序,高速排序就没有合并的过程.仅仅有划分,高速排序的划分过程非常重要,排序是在划分的过程

算法导论第7章___快速排序

快速排序本质上是插入排序,但是它在这个基础上增强了算法. 下面我们来分析一下快速排序: 有了前面的分析基础,我们在来看排序算法也就容易多了. public class Quick_Sort { private void quick_Sort(int []A,int left,int right){ if(left<right){ //划区比较,这个partition 第一次!得到的就是我们刚才说的2. int partition=partition(A, left, right); //实现第一

算法导论 第8章 线性时间排序

合并排序和堆排序的时间复杂度为O(nlgn),插入排序和冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度在平均情况下是O(nlgn),这些排序算法都是通过对元素进行相互比较从而确定顺序的,因此都叫比较排序. 比较排序可以看做是决策树(一个满二叉树),因为每一次比较都是一个分支.n个元素的序列,其排序的结果有 n! 种可能(n个元素的全排),所以这个决策树有 n! 个叶子结点,假设树的高度为h,则有:n! <= 2^h,所以h >= lg(n!) = Ω(nlgn).一次比较排序就是从决

算法导论 第9章 中位数和顺序统计学

/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */ #include <iostream> #include <ctime> using namespace std; int minimum(int *arr, int len); int randomizedSelect(int *arr, int p, int r, int i); int randomizedPartition(int *arr, int p, int r); void exchange

第七章、Python字符编码

第七章.Python字符编码 一.定义 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码":反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密.在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码. 字符(Character):是一个信息单位,在计算机里面,一个中文汉字是一个字符,一个英