算法导论(三) 快速排序

快排

直接上代码,数学推导以后再上

还有一版随机化版本的快速排序

#include <iostream>

using namespace std;

void _swap(int a[] , int i , int j)//交换函数
{

    int temp;
    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

int  Partition(int *a,int p,int r)//划分程序
{
    int x,i;
    x=a[r];
    i=p-1;
    for(int j=p;j<r;j++)
    {
        if(a[j]<=x){
            i+=1;
            _swap(a,i,j);
        }

    }
    _swap(a,i+1,r);
        return i+1;
}

void QuickSort(int *a,int p,int r)//
{
    int q;
    if(p<r){
        q=Partition(a,p,r);
        QuickSort(a,p,q-1);
        QuickSort(a,q+1,r);
    }
}

int main()
{
    int a[9];
    for(int k=0;k<9;k++)
        cin>>a[k];

    QuickSort(a,0,8);//入口
    for(int k=0;k<9;k++)
        cout<<a[k]<<"-----"<<endl;
    return 0;
}
时间: 2024-08-30 15:01:39

算法导论(三) 快速排序的相关文章

算法导论:快速排序

快速排序是基于分治策略的.对一个子数组A[p…r]快速排序的分治过程的三个步骤为: 分解: 数组A[p…r]被划分成两个(可能空)子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],且小于等于A[q+1…r]中的元素.下标q也在这个划分过程中进行计算. 解决: 通过递归调用快速排序,对子数组A[p…q-1]和A[q+1…r]排序. 合并: 因为两个子数组就是原地排序的,将它们的合并不需要操作:整个数组A[p…r]已排序. 伪代码 算法的关键是求q的par

算法导论:快速排序和插入排序

代码实现 1 #ifndef _SORT_H 2 #define _SORT_H 3 4 // goal: quicksort and insertsort 5 // time: 12/2/2014 6 // author: zrss 7 // reference: introduction to algorithms 8 9 class Sort { 10 public: 11 void quickSort(int A[], int p, int r); 12 void insertSort(

算法导论之快速排序

快速排序 个人思绪很混乱, 建议直接看原文 简洁版: 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 = PARTI

算法导论之七(中位数和顺序统计量之选择算法)

实际生活中,我们经常会遇到这类问题:在一个集合,谁是最大的元素?谁是最小的元素?或者谁是第二小的元素?....等等.那么如何在较短的时间内解决这类问题,就是本文要阐述的. 先来熟悉几个概念: 1.顺序统计量: 在一个由n个元素组成的集合中,第i个顺序统计量(order statistic)是该集合中第i小的元素.最小值是第1个顺序统计量(i=1),最大值是第n个顺序统计量(i=n).   2.中位数: 一个中位数是它所属集合的"中点元素",当n为奇数时,中位数是唯一的,位于i=(n+1

[算法导论]quicksort algorithm @ Python

算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if array[j] <= array[right]: i += 1 array[j], array[i] = array[i], array[j] array[i+1], array[right] = array[right], array[i+1] return i+1 def quicksort(arr

算法导论4:快速排序 2016.1.4

今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想.我觉得很有道理. 好吧,不扯了.原谅我看书选择了速读策略,中间有很多感觉目前还很难看懂,以后有时间再细细学习.把略过去的在这里记一下. 一.矩阵乘法算法.复杂度从n^3优化到了n^2.81 (数字比较神奇).因为还没学线性代数,所以以后学了再看. 二.递归复杂度的计算和估计.这部分看起来有些复杂,好像需要比较高的数学水平,有空研究一下. 三.堆排序.这个以前已经写过了.http://www.cnblogs.com/itlqs/p/475

算法导论第七章快速排序

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

算法导论——lec 07 快速排序

一. 快速排序的描述 1. 快速排序是一种原地排序的算法,最坏情况下的时间复杂度为Θ(n^2),期望的运行时间为Θ(n logn),且其中隐含的常数因子较小. 2. 快速排序分三个步骤: 分解:数组A[p...r]被划分成两个数组A[p...q-1]和A[q+1...r],使得A[p...q-1]中的元素都小于等于A[q],A[q+1...r]中的元素都大于等于A[q].下标q在这个划分过程中计算. 解决:递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序. 合并:两个

《算法导论》 — Chapter 7 快速排序

序 快速排序(QuickSort)也是一种排序算法,对包含n个数组的输入数组,最坏情况运行时间为O(n^2).虽然这个最坏情况运行时间比较差,但是快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,期望的运行时间为O(nlgn),且O(nlgn)中隐含的常数因子很小,另外它还能够进行就地排序在虚拟环境中也能很好的工作. 原理 快速排序也和合并排序一样,基于分治法,分为分解.解决.合并三个步骤: 分解:数组array[low-high]被分为两个(可能空)子数组array[low-te

《算法导论》读书笔记(三)

本章介绍了快速排序及其算法分析,快速排序采用的是分治算法思想,对包含n个数的输入数组,最坏情况下运行时间为θ(n^2),但是平均性能相当好,期望的运行时间为θ(nlgn).另外快速排序能够就地排序(我理解是不需要引入额外的辅助空间,每次划分能确定一个元素的具体位置),在虚拟环境中能很好的工作. 1.快速排序的描述 快速排序算法采用的分治算法,因此对一个子数组A[p-r]进行快速排序的三个步骤为: (1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...