快速排序

原创 2015年11月18日 20:43:55

概要

  1. 理解快速排序的思想
  2. 理解分治以及排序过程的设计巧妙之处
  3. 深入理解时间复杂度分析,最好与最坏情况下的时间复杂度分析,生成树分析法,代入法,主方法。

伪代码

//返回的是分割点,即主元
//循环维护的部分为四个部分
// p...i...j.....r
// p..i 维护 <= r 的元素
// i+1 ... j 维护 > r 的元素
// j+1 ... r-1 的元素暂时没有处理,一次过程只需要O(n)
// r主元作为评价标准

partition(A, p, r)
{
        x = A[r]; //主元,作为依据
        i = p - 1;
        for j = p to r-1 
        {
                if (A[j] <= x) //升序
                {
                        i++;
                        exchange A[i] with A[j]
                }
        }
        exchange A[i + 1] with A[r]

        return i + 1;      
}

//第一次调用的时候要用, qsort_normal(A, 1, A.length);
qsort_normal(A, p, r)
{
        if (p < r) 
        {
                q = partition(A, p, r);
                qsort_normal(A, p, q - 1);
                qsort_normal(A, q + 1, r);
        }
}

最好情况下,期望时间复杂度是 O(n * log n)
最坏情况下,期望时间复杂度是 O(n * n)

一般情况下,划分会导致一部分差一部分好,只要好坏的比例是常数比例,其期望时间复杂度就是 O(n * log n),可以用生成树来证明:
假设比例是 alpha : 1 - alpha , (alpha <= 1/2)
那么 alpha < 1 - alpha
因此生成树里最先到达叶子的部分(即最短)满足:
c * exp(alpha, k) = 1
最后到达叶子的部分(即最长)满足:
c * exp(1-alpha, k) = 1
求解,都是log n,加上n次,因此复杂度仍然是 O(n * log n)

实现代码

qsort.h文件

#ifndef QSORT_NORMAL_H
#define QSORT_NORMAL_H

#include <stdio.h>
#include <stdlib.h>

typedef int DATATYPE;


int partition(DATATYPE *array, DATATYPE p, DATATYPE r)
{
    DATATYPE pivot = array[r];
    DATATYPE i = p - 1;
    for (DATATYPE j = p; j <= r - 1; j++) {
        if (array[j] <= pivot) {
            i++;
            DATATYPE temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
    DATATYPE temp_ = array[i + 1];
    array[i + 1] = array[r];
    array[r] = temp_;

    return i + 1;
}

void qsort_normal(DATATYPE *array, DATATYPE i, DATATYPE j)
{   
    // first call (A, 1, length);
    if (i < j) {
        DATATYPE q = partition(array, i, j);
        qsort_normal(array, i, q - 1);
        qsort_normal(array, q + 1, j);
    }
}

#endif

qsort.c 文件

#include "./qsort_normal.h"


int main()
{
    DATATYPE array[11] = {3, 4, 5, 1, 7, 23, 8, 10, 4, 2};

    qsort_normal(array, 0, 10);

    for (int i = 1; i <= 10; i++) {
        printf("%d ", array[i]);
    }

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

快速排序 题目及答案

http://blog.csdn.net/sws9999/article/details/2791812
  • guotong1988
  • guotong1988
  • 2012年09月06日 17:23
  • 1829

快速排序——JAVA实现(图文并茂)

高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数...
  • as02446418
  • as02446418
  • 2015年08月10日 11:08
  • 2560

什么是快速排序

什么是快速排序 快速排序简介 快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,...
  • miao309410364
  • miao309410364
  • 2015年06月05日 13:28
  • 836

快速排序(基准是中位数)

简介:  快排相比冒泡等相对较快,是因为其是跳跃式交换(快,要根据数据量等)下面算法介绍:  ①根据数据量,若大于cutoff,则用快排,反之用插入排序  ②先找基准(这里采用中位数),并将基准放在R...
  • fanfan4569
  • fanfan4569
  • 2017年01月02日 11:46
  • 688

快速排序实例化(详细过程)

数组a[] = {8,10,23,48,7,6,11,13,17,19,20,14,5},  1)、设置两个变量i、j,排序开始的时候i=1,j=13; 2)以第一个数组元素作为关键数据,赋值给x...
  • qq_22186183
  • qq_22186183
  • 2016年12月24日 16:43
  • 1144

快速排序及优化(Java版)

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。 一次快速排序详细过程: 选择数组第一个值作为枢轴值。 代码实现:package Q...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年06月12日 20:56
  • 2837

算法 -- Java实现快速排序(图解 + 代码实现)

算法 -- Java实现快速排序(图解 + 代码实现)...
  • feng2qing
  • feng2qing
  • 2016年12月25日 10:58
  • 843

快速排序理解(挖坑填坑比喻理解)

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个...
  • WitsMakeMen
  • WitsMakeMen
  • 2013年12月02日 22:01
  • 4310

快速排序详解(递归法)

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个...
  • u012128533
  • u012128533
  • 2014年11月12日 16:08
  • 613

快速排序(递归版)

快速排序是最经典的排序算法,它用途广泛,效率很高,也经常被拿来检验coder的基本功底。此篇作为快排的学习笔记。快排的基本思想快速排序是典型的分治算法,理解了快排的思想,很容易写出递归版的代码。快排分...
  • sixdaycoder
  • sixdaycoder
  • 2015年07月14日 16:20
  • 1239
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序
举报原因:
原因补充:

(最多只允许输入30个字)